MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy są jakieś korzyści z używania niestandardowego identyfikatora _id dla dokumentów w MongoDB?

Korzyści z wygenerowania własnego _id s:

  • Możesz uczynić je bardziej przyjaznymi dla człowieka, przypisując kolejne liczby:1 , 2 , 3 , ...

  • Możesz też uczynić je bardziej przyjaznymi dla człowieka, używając losowych ciągów:t3oSKd9q

    (To nie zajmuje zbyt dużo miejsca na ekranie, może zostać wybrane z listy i potencjalnie może zostać skopiowane ręcznie, jeśli zajdzie taka potrzeba. Musisz jednak wydłużyć czas na tyle, aby zapobiec zmowie).

  • Jeśli używasz losowo generowanych ciągów, będą one miały w przybliżeniu równomierną dystrybucję fragmentów, w przeciwieństwie do standardowych identyfikatorów mongo ObjectId, które mają tendencję do grupowania rekordów utworzonych w tym samym czasie w tym samym fragmencie. (To, czy jest to pomocne, czy nie, naprawdę zależy od Twojej strategii shardingu).

  • Lub możesz wygenerować własny niestandardowy _id s, które grupują powiązane obiekty w jeden fragment, np. według właściciela, regionu geograficznego lub kombinacji. (Ponownie, czy jest to pożądane, czy nie, zależy od tego, jak zamierzasz przeszukiwać dane i/lub jak szybko je produkujesz i przechowujesz. Możesz to również zrobić, określając klucz fragmentu zamiast _id samo. Zobacz dyskusję poniżej.)

Zalety korzystania z ObjectId s:

  • ObjectIds są bardzo dobre w unikaniu kolizji. Jeśli wygenerujesz własny _id jest losowo lub równolegle, musisz samodzielnie zarządzać ryzykiem kolizji.

  • ObjectIds zawierają w nich czas ich utworzenia. Może to być tani i łatwy sposób na zachowanie daty utworzenia dokumentu i chronologiczne sortowanie dokumentów. (Z drugiej strony, jeśli nie chcesz ujawniać/wyciekać daty utworzenia dokumentu, nie możesz ujawniać jego ObjectId!)

nanoid moduł może pomóc w wygenerowaniu krótkich losowych identyfikatorów. Zapewniają również kalkulator które mogą pomóc Ci wybrać odpowiednią długość identyfikatora, w zależności od tego, ile dokumentów/identyfikatorów generujesz w ciągu godziny.

Alternatywnie napisałem mongoose-generate-unique-key do generowania bardzo krótkie losowe identyfikatory (pod warunkiem, że korzystasz z biblioteki mangusty).

Strategie shardingu

Nie będę twierdził, że jestem ekspertem, jak najlepiej shardować dane, ale oto kilka sytuacji, które możemy rozważyć:

  1. Obserwatorium astronomiczne lub akcelerator cząstek przetwarza gigabajty danych na sekundę. Po wykryciu interesującego zdarzenia mogą chcieć przechować ogromną ilość danych w zaledwie kilka sekund. W takim przypadku prawdopodobnie chcą równomiernego rozłożenia dokumentów we fragmentach, aby każdy fragment pracował równie ciężko nad przechowywaniem danych i żaden fragment nie zostanie przytłoczony.

  2. Masz ogromną ilość danych i czasami musisz przetworzyć je wszystkie od razu. W tym przypadku (ale w zależności od algorytmu) równomierny rozkład może być ponownie pożądany, aby wszystkie odłamki mogły równie ciężko pracować nad przetwarzaniem swojego fragmentu danych, przed połączeniem wyników na końcu. (Chociaż w tym scenariuszu możemy polegać na systemie równoważenia MongoDB, a nie na naszym kluczu fragmentu, w przypadku równomiernej dystrybucji. Po zapisaniu danych system równoważenia działa w tle. Po zebraniu dużej ilości danych może być konieczne zostaw to, aby rozłożyć kawałki na noc).

  3. Masz aplikację społecznościową z dużą ilością danych, ale tym razem wielu różnych użytkowników zadaje wiele lekkich zapytań związane głównie z ich własnymi danymi lub ich konkretnymi znajomymi lub tematami. W tym przypadku nie ma sensu angażować każdego fragmentu, gdy użytkownik wykonuje małe zapytanie. Może mieć sens dzielenie według identyfikatora użytkownika (lub według tematu lub regionu geograficznego), aby wszystkie dokumenty należące do jednego użytkownika były przechowywane w jednym fragmencie, a gdy ten użytkownik wykonuje zapytanie, tylko jeden fragment musi działać. Powinno to pozostawić pozostałym fragmentom swobodę przetwarzania zapytań dla innych użytkowników, dzięki czemu wielu użytkowników może być obsługiwanych jednocześnie.

  4. Dzielenie dokumentów według czasu utworzenia (które zapewnią domyślne identyfikatory ObjectIds) może być pożądane, jeśli masz wiele lekkich zapytań dotyczących danych z podobnych okresów. Na przykład wielu różnych użytkowników wysyła zapytania do różnych wykresów historycznych.

    Ale może nie być tak pożądane, jeśli większość użytkowników pyta tylko o najnowsze dokumenty (częsta sytuacja na platformach społecznościowych), ponieważ oznaczałoby to, że jeden lub dwa fragmenty będą wykonywać większość pracy. Dystrybucja według tematu lub może według regionu może zapewnić bardziej płaską ogólną dystrybucję, jednocześnie pozwalając na zgrupowanie powiązanych dokumentów w jednym fragmencie.

Możesz przeczytać oficjalne dokumenty na ten temat:



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Grupowanie dokumentów w MongoDB na specjalnych warunkach

  2. tajemniczy błąd mongodb LEFT_SUBFIELD obsługuje tylko Object:statystyki nie:6

  3. Jak zaktualizować każdą wartość za pomocą jednego zapytania w mongodb

  4. Wyszukiwanie MongoDB według typu DateTime nie działa

  5. Jak skonfigurować mongodb do usuwania starych plików dziennika?