OK, myślę, że musisz podzielić to na podstawowe „odmiany”.
Masz dwa obiekty w stylu „entity”:
User
Campaign
Masz jeden obiekt w stylu „mapowania”:
UserCampaign
Masz jeden obiekt w stylu „transakcyjnym”:
Click
Krok 1:podmiot
Zacznijmy od prostych:User
&Campaign
. To są naprawdę dwa oddzielne obiekty, żaden z nich nie zależy tak naprawdę od drugiego, jeśli chodzi o jego istnienie. Nie ma również dorozumianej hierarchii między nimi:użytkownicy nie należą do kampanii ani kampanie nie należą do użytkowników.
Kiedy masz dwa takie obiekty najwyższego poziomu, zazwyczaj zdobywają one własną kolekcję. Więc będziesz chciał Users
kolekcja i Camapaigns
kolekcja.
Krok 2:mapowanie
UserCampaign
jest obecnie używany do reprezentowania mapowania N-do-M. Teraz, ogólnie rzecz biorąc, kiedy masz mapowanie N-do-1, możesz umieścić N wewnątrz 1. Jednak przy mapowaniu N-to-M generalnie musisz "wybrać stronę".
Teoretycznie możesz wykonać jedną z następujących czynności:
- Umieść listę
Campaign ID
s wewnątrz każdegoUser
- Umieść listę
Users ID
s wewnątrz każdejCampaign
Osobiście zrobiłbym #1. Prawdopodobnie masz znacznie więcej użytkowników, którzy prowadzą kampanie, i prawdopodobnie chcesz umieścić tablicę tam, gdzie będzie ona krótsza.
Krok 3:transakcyjny
Clicks to naprawdę zupełnie inna bestia. W kategoriach obiektowych możesz pomyśleć, co następuje:Clicks
"należą do" User
, Clicks
„należą do” Campaign
. Tak więc teoretycznie możesz po prostu przechowywać kliknięcia, które są częścią jednego z tych obiektów. Łatwo pomyśleć, że kliknięcia należą do pod Użytkownicy lub kampanie.
Ale jeśli naprawdę poszukasz głębiej, powyższe uproszczenie jest naprawdę wadliwe. W Twoim systemie Clicks
są naprawdę centralnym obiektem. W rzeczywistości możesz nawet powiedzieć, że użytkownicy i kampanie są tak naprawdę „powiązane” z kliknięciem.
Spójrz na pytania / zapytania, które zadajesz. Wszystkie te pytania w rzeczywistości koncentrują się wokół kliknięć. Użytkownicy i kampanie nie są głównym obiektem Twoich danych, ale kliknięcia są.
Dodatkowo Kliknięcia będą najobfitszą ilością danych w Twoim systemie. Będziesz mieć znacznie więcej kliknięć niż cokolwiek innego.
Jest to największy problem przy projektowaniu schematu dla takich danych. Czasami trzeba odepchnąć obiekty „rodzice”, gdy nie są one najważniejsze. Wyobraź sobie budowanie prostego systemu e-commerce. Oczywiste jest, że orders
będzie „należeć do” users
, ale orders
jest tak ważny dla systemu, że będzie obiektem „najwyższego poziomu”.
Zawijanie
Prawdopodobnie będziesz potrzebować trzech kolekcji:
- Użytkownik -> ma listę kampanii._id
- Kampania
- Kliknięcia -> zawiera user._id, Campaign._id
Powinno to zaspokoić wszystkie Twoje potrzeby związane z zapytaniami:
Zobacz informacje z każdego kliknięcia, takie jak IP, Referer, OS itp.
db.clicks.find()
Zobacz, jak często kliknięcia pochodzą z X IP, X Referer, X OS
db.clicks.group()
lub uruchom Map-Reduce.
Powiąż każde kliknięcie z użytkownikiem i kampanią
db.clicks.find({user_id : blah})
Możliwe jest również przekazanie identyfikatorów kliknięć zarówno użytkownikom, jak i kampaniom (jeśli ma to sens).
Pamiętaj, że jeśli masz bardzo dużo kliknięć, naprawdę będziesz musiał przeanalizować najczęściej uruchamiane zapytania. Nie możesz indeksować w każdym polu, więc często będziesz chciał uruchomić Map-Reduces, aby „zestawić” dane dla tych zapytań.