sql >> Databáze >  >> NoSQL >> MongoDB

Jak mám implementovat toto schéma v MongoDB?

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í:

  1. Uveďte seznam Campaign ID s uvnitř každého User
  2. 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:

  1. Uživatel -> má seznam id kampaně.
  2. Kampaň
  3. 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.



  1. Použití sed na proměnnou xargs nefunguje uvnitř expanze shellu

  2. Použití uložených funkcí JavaScriptu v agregačním kanálu, MapReduce nebo runCommand

  3. Jak zorganizovat mnoho až mnoho vztahů v MongoDB

  4. Vytvořte víceklíčový index v MongoDB