OK, myslím, že to musíte rozdělit na základní "odrůdy".
Máte dva objekty ve stylu "entity":
User
Campaign
Máte jeden objekt ve stylu "mapování":
UserCampaign
Máte jeden objekt ve stylu "transakční":
Click
Krok 1:entita
Začněme těmi jednoduššími:User
&Campaign
. Jsou to skutečně dva samostatné objekty, ani jeden na druhém skutečně nezávisí svou existencí. Mezi těmito dvěma také neexistuje žádná implicitní hierarchie:Uživatelé nepatří do kampaní, ani kampaně nepatří uživatelům.
Když máte dva objekty nejvyšší úrovně, jako je tento, obvykle získávají vlastní sbírku. Takže budete chtít Users
kolekce a Camapaigns
kolekce.
Krok 2:mapování
UserCampaign
se v současnosti používá k reprezentaci N-to-M mapování. Obecně platí, že když máte mapování N-to-1, můžete umístit N dovnitř 1. Nicméně s mapováním N-to-M si obecně musíte "vybrat stranu".
Teoreticky můžete provést jednu z následujících akcí:
- Uveďte seznam
Campaign ID
s uvnitř každéhoUser
- Uveďte seznam
Users ID
uvnitř každéCamapaigns
Osobně bych udělal číslo 1. Pravděpodobně máte mnohem více uživatelů než kampaně a pravděpodobně budete chtít umístit pole tam, kde bude kratší.
Krok 3:Transakční
Clicks je opravdu úplně jiná bestie. Objektově byste si mohli myslet následující:Clicks
"patří" User
, Clicks
„patří do“ Camapaigns
. Teoreticky byste tedy mohli ukládat kliknutí jako součást jednoho z těchto objektů. Je snadné si myslet, že kliknutí patří pod Uživatelé nebo kampaně.
Ale pokud se opravdu ponoříte hlouběji, výše uvedené zjednodušení je opravdu chybné. Ve vašem systému Clicks
jsou skutečně ústředním objektem. Ve skutečnosti byste dokonce mohli říci, že uživatelé a kampaně jsou skutečně „spojeny“ s kliknutím.
Podívejte se na otázky/dotazy, na které se ptáte. Všechny tyto otázky se ve skutečnosti soustředí na kliknutí. Uživatelé a kampaně nejsou ústředním objektem vašich údajů, ale kliknutí jsou.
Kromě toho budou kliknutí nejhojnějším údajem ve vašem systému. Budete mít mnohem více kliknutí než cokoli jiného.
To je největší problém při navrhování schématu pro data, jako je toto. Někdy je potřeba odstrčit „rodičovské“ předměty, když nejsou to nejdůležitější. Představte si vytvoření jednoduchého systému elektronického obchodování. Je jasné, že orders
by "patřil" users
, ale orders
je v systému tak centrální, že se stane objektem "nejvyšší úrovně".
Zabalím to
Pravděpodobně budete chtít tři kolekce:
- Uživatel -> má seznam id kampaně.
- Kampaň
- Kliknutí -> obsahuje user._id, campaign._id
To by mělo uspokojit všechny potřeby vašeho dotazu:
Podívejte se na informace z každého kliknutí, jako je IP, Referer, OS atd
db.clicks.find()
Podívejte se, kolik kliknutí přichází z X IP, X Referer, X OS
db.clicks.group()
nebo spusťte Map-Reduce.
Přiřaďte každé kliknutí uživateli a kampani
db.clicks.find({user_id : blah})
Je také možné vložit ID kliknutí do uživatelů i kampaní (pokud to dává smysl).
Upozorňujeme, že pokud máte mnoho a mnoho kliknutí, budete muset skutečně analyzovat dotazy, které spouštíte nejčastěji. Nemůžete indexovat všechna pole, takže často budete chtít spustit Map-Reduces, abyste „shrnuli“ data pro tyto dotazy.