programing

MongoDB에서 이 스키마를 어떻게 구현해야 합니까?

abcjava 2023. 7. 30. 16:47
반응형

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 매핑에서는 일반적으로 "한쪽을 선택"해야 합니다.

이론적으로 다음 중 하나를 수행할 수 있습니다.

  1. 목록을 작성합니다.Campaign ID의 각의내부 s.User
  2. 목록을 작성합니다.Users ID의 각의내부 s.Campaign

개인적으로 1위를 하겠습니다.캠페인을 하는 사용자가 훨씬 더 많을 것이며, 더 짧은 위치에 배열을 배치하기를 원할 것입니다.

3단계: 트랜잭션

클릭은 정말 완전히 다른 짐승입니다.과 같이 할 수 .Clicksa의 ""에 "▁to▁a기User,Clicksa의 ""에 "▁to▁a기Campaign이론적으로는 클릭을 저장할 수 있습니다.클릭은 사용자 또는 캠페인에 속한다고 쉽게 생각할 수 있습니다.

하지만 만약 여러분이 정말로 더 깊이 파고 든다면, 위의 단순화는 정말로 결함이 있습니다. 당의시에서템스신,,Clicks정말로 중심적인 대상입니다.실제로 사용자 및 캠페인은 클릭과 "연결"되어 있다고 말할 수도 있습니다.

질문/질문을 살펴봅니다.이 모든 질문들은 실제로 클릭을 중심으로 합니다.사용자와 캠페인은 데이터의 중심 개체가 아닙니다. 클릭은 데이터의 중심 개체입니다.

또한 클릭은 시스템에서 가장 풍부한 데이터가 될 것입니다.다른 어떤 것보다 클릭 수가 훨씬 많을 것입니다.

이는 이러한 데이터에 대한 스키마를 설계할 때 가장 큰 문제입니다.때로는 "부모" 개체가 가장 중요하지 않을 때 밀어낼 필요가 있습니다.간단한 전자 상거래 시스템을 구축한다고 상상해 보십시오.은 명백합니다orders"users,그렇지만orders는 시스템의 매우 핵심적인 요소이므로 "최상위" 개체가 될 것입니다.

마무리

당신은 아마도 세 가지 컬렉션을 원할 것입니다.

  1. 사용자 -> 캠페인 목록이 있습니다._id
  2. 캠페인
  3. 클릭 ->에는 사용자가 포함됩니다._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 }

  1. mongodb는 어떤 회사에서 변경된 사항이 있다면 많은 양의 문서를 업데이트하는 것은 문제가 되지 않습니다.

  2. 중첩 수집 여부는 수집 중인 데이터 양에 따라 달라집니다.이 경우 '클릭' 컬렉션에 '큰 양의 데이터'가 포함된다는 것을 알고 있다면 별도의 컬렉션을 만들어야 합니다.확실히 '클릭'을 위해서는 페이징, 필터링 등이 필요하고 사용자는 '가벼운' 수집이 될 것이기 때문입니다.

그래서 저는 다음을 제안합니다.

User {
     Campaigns: []
}

Clicks {
 user_id,
 camp_id
}

언급URL : https://stackoverflow.com/questions/4662530/how-should-i-implement-this-schema-in-mongodb

반응형