MongoDB에서 이 스키마를 어떻게 구현해야 합니까?
추적 스크립트를 작성하려고 하는데 데이터베이스가 어떻게 작동해야 하는지 파악하는 데 어려움을 겪고 있습니다.
MySQL에서 다음과 유사한 테이블을 만듭니다.
User:
username_name: string
Campaign:
title: string
description: string
link: string
UserCampaign:
user_id: integer
camp_id: integer
Click:
os: text
referer: text
camp_id: integer
user_id: integer
다음을 수행할 수 있어야 합니다.
- 클릭할 때마다 IP, Referer, OS 등의 정보를 확인할 수 있습니다.
- X IP, X Referer, X OS에서 클릭 횟수 확인
- 각 클릭을 사용자 및 캠페인과 연결
만약 내가 무언가를 한다면,
User {
Campaigns: [
{
Clicks: []
}
]
}
두 가지 문제에 직면했습니다.
- 각 사용자에 대해 새 캠페인 개체를 생성하는데, 문제는 캠페인을 업데이트해야 하는 경우 각 사용자에 대해 개체를 업데이트해야 하기 때문입니다.
- Clicks 배열에 많은 양의 데이터가 포함되어 있을 것으로 예상됩니다. User 개체의 일부로 설정하면 쿼리가 매우 느려질 것 같습니다.
좋아요, 저는 당신이 이것을 기본적인 "다양성"으로 나눌 필요가 있다고 생각합니다.
두 개의 "엔티티" 스타일 객체가 있습니다.
User
Campaign
하나의 "매핑" 스타일 객체가 있습니다.
UserCampaign
하나의 "트랜잭션" 스타일 객체가 있습니다.
Click
1단계: 엔티티
쉬운것부시보작겠니다습해터다보▁let니겠습.User
&Campaign
이것들은 정말로 두 개의 분리된 물체입니다. 둘 중 어느 것도 그것의 존재를 위해 다른 것에 의존하지 않습니다.또한 이 둘 사이에는 암묵적인 위계질서가 존재하지 않습니다.사용자는 캠페인에 속하지 않으며 캠페인도 사용자에 속하지 않습니다.
이와 같은 최상위 개체 두 개가 있으면 일반적으로 자체 컬렉션을 얻습니다.그래서 당신은 원할 것입니다.Users
과 1파운드짜리 동전Camapaigns
수집.
2단계: 매핑
UserCampaign
는 현재 N-to-M 매핑을 나타내는 데 사용됩니다.일반적으로, N 대 1 매핑이 있을 때, N을 1 안에 넣을 수 있습니다.그러나 N-to-M 매핑에서는 일반적으로 "한쪽을 선택"해야 합니다.
이론적으로 다음 중 하나를 수행할 수 있습니다.
- 목록을 작성합니다.
Campaign ID
의 각의내부 s.User
- 목록을 작성합니다.
Users ID
의 각의내부 s.Campaign
개인적으로 1위를 하겠습니다.캠페인을 하는 사용자가 훨씬 더 많을 것이며, 더 짧은 위치에 배열을 배치하기를 원할 것입니다.
3단계: 트랜잭션
클릭은 정말 완전히 다른 짐승입니다.과 같이 할 수 .Clicks
a의 ""에 "▁to▁a기User
,Clicks
a의 ""에 "▁to▁a기Campaign
이론적으로는 클릭을 저장할 수 있습니다.클릭은 사용자 또는 캠페인에 속한다고 쉽게 생각할 수 있습니다.
하지만 만약 여러분이 정말로 더 깊이 파고 든다면, 위의 단순화는 정말로 결함이 있습니다. 당의시에서템스신,,Clicks
정말로 중심적인 대상입니다.실제로 사용자 및 캠페인은 클릭과 "연결"되어 있다고 말할 수도 있습니다.
질문/질문을 살펴봅니다.이 모든 질문들은 실제로 클릭을 중심으로 합니다.사용자와 캠페인은 데이터의 중심 개체가 아닙니다. 클릭은 데이터의 중심 개체입니다.
또한 클릭은 시스템에서 가장 풍부한 데이터가 될 것입니다.다른 어떤 것보다 클릭 수가 훨씬 많을 것입니다.
이는 이러한 데이터에 대한 스키마를 설계할 때 가장 큰 문제입니다.때로는 "부모" 개체가 가장 중요하지 않을 때 밀어낼 필요가 있습니다.간단한 전자 상거래 시스템을 구축한다고 상상해 보십시오.은 명백합니다orders
"users
,그렇지만orders
는 시스템의 매우 핵심적인 요소이므로 "최상위" 개체가 될 것입니다.
마무리
당신은 아마도 세 가지 컬렉션을 원할 것입니다.
- 사용자 -> 캠페인 목록이 있습니다._id
- 캠페인
- 클릭 ->에는 사용자가 포함됩니다._id, campaign._id
이렇게 하면 모든 쿼리 요구 사항을 충족할 수 있습니다.
클릭할 때마다 IP, Referer, OS 등의 정보를 확인할 수 있습니다.
db.clicks.find()
X IP, X Referer, X OS에서 클릭 횟수 확인
db.clicks.group()
또는 맵 축소를 실행합니다.
각 클릭을 사용자 및 캠페인과 연결
db.clicks.find({user_id : blah})
클릭 ID를 사용자와 캠페인 모두에 푸시할 수도 있습니다(적절한 경우).
클릭 수가 많고 많은 경우 가장 많이 실행하는 쿼리를 분석해야 합니다.모든 필드에서 색인을 작성할 수는 없으므로, 맵 축소를 실행하여 이러한 쿼리에 대한 데이터를 "롤업"할 수 있습니다.
여기서 볼 수 있는 주요 문제는 관계형 데이터베이스 개념을 문서 지향 데이터베이스에 적용하려고 한다는 것입니다.두 가지 주요 차이점은 NOSQL 데이터베이스의 스키마나 구조가 아니라 수집과 문서에 대해 걱정한다는 것입니다.
SQL에서와 같이 NOSQL의 많은 구현에는 조인 개념이 없음을 이해하는 것이 매우 중요합니다.즉, 데이터를 여러 컬렉션에 분산시킨 후 나중에 접착제로 사용하기 위해 많은 작업을 수행해야 합니다.또한 SQL DB의 정규화에서와 같이 데이터를 여러 컬렉션에 분산시킴으로써 얻을 수 있는 이점은 없습니다.문서의 일부인 데이터와 해당 데이터가 어떤 컬렉션에 적용되는지를 생각해야 하며 NOSQL DB의 구현에 대해 걱정할 필요가 없습니다.그래서 당신의 문제에 대한 답은..그리고 당신이 요청한 모든 것을 지원할 것입니다.
db.trackclicks==> 컬렉션
trackclick = {OS : XP, 사용자 : John Doe, 캠페인 : {property: test, property: test, link : url}, Referrer : google.com }
mongodb는 어떤 회사에서 변경된 사항이 있다면 많은 양의 문서를 업데이트하는 것은 문제가 되지 않습니다.
중첩 수집 여부는 수집 중인 데이터 양에 따라 달라집니다.이 경우 '클릭' 컬렉션에 '큰 양의 데이터'가 포함된다는 것을 알고 있다면 별도의 컬렉션을 만들어야 합니다.확실히 '클릭'을 위해서는 페이징, 필터링 등이 필요하고 사용자는 '가벼운' 수집이 될 것이기 때문입니다.
그래서 저는 다음을 제안합니다.
User {
Campaigns: []
}
Clicks {
user_id,
camp_id
}
언급URL : https://stackoverflow.com/questions/4662530/how-should-i-implement-this-schema-in-mongodb
'programing' 카테고리의 다른 글
문자열에서 영숫자가 아닌 모든 문자 바꾸기 (0) | 2023.07.30 |
---|---|
PowerShell이 빈 배열을 배열로 반환하지 않음 (0) | 2023.07.30 |
속성 x가 없는 요소와 일치하는 css 선택기 (0) | 2023.07.30 |
C# 대소문자를 구분하지 않는 동등 연산자가 있습니까? (0) | 2023.07.30 |
웹 페이지의 일련 번호를 기준으로 SQL을 데이터로 채우는 Python (0) | 2023.07.30 |