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

mongodb část objectid bude s největší pravděpodobností jedinečná

Pokud máte více webových serverů s více procesy, pak opravdu neexistuje nic, co byste mohli odstranit se ztrátou jedinečnosti.

Pokud se podíváte na povahu ObjectId :

  • 4bajtová hodnota představující sekundy od epochy Unixu,
  • 3bajtový identifikátor počítače,
  • 2bajtové ID procesu a
  • 3bajtový čítač začínající náhodnou hodnotou.

Uvidíte, že toho tam není mnoho, co byste mohli bezpečně odstranit. Protože první 4 bajty jsou čas, bylo by náročné implementovat algoritmus, který by odstranil části časového razítka čistým a bezpečným způsobem.

Identifikátor stroje a identifikátor procesu se používají v případech, kdy existuje více serverů a/nebo procesů fungujících jako klienti databázového serveru. Pokud jste některý z nich zahodili, mohli byste znovu skončit s duplikáty. Náhodná hodnota jako poslední 3 bajty se používá k zajištění toho, aby dva identifikátory na stejném počítači v rámci stejného procesu byly jedinečné, i když jsou vyžadovány často.

Pokud jste jej používali jako id objednávky a chcete mít zaručenou jedinečnost, neubral bych nic z 12bajtového čísla, protože bylo pečlivě navrženo tak, aby poskytovalo robustní a efektivní distribuovaný mechanismus pro generování jedinečných čísel, když je mnoho připojených databázových klientů.

Pokud jste vzali posledních 5 znaků ObjectId ... a v daném období, jaká je pravděpodobnost konfliktu?

  • ID procesu
  • počítadlo

Pravděpodobnost konfliktu je vysoká . ID procesu může zůstat stejné po celou dobu a druhé číslo je pouze zvyšující se číslo, které by se opakovalo po 4095 objednávkách. Ale pokud se proces recykluje, pak máte také šanci, že dojde ke konfliktu se staršími objednávkami atd. A pokud mluvíte o více databázových klientech, šance se také zvyšují. Jen bych se nepokoušel ořezávat číslo. Nestojí to za to, aby se nešťastní zákazníci snažili zadávat objednávky.

Ani časové razítko a náhodná počáteční hodnota nejsou dostatečné, když ObjectIds generuje více databázových klientů . Když se začnete dívat na různé části, zejména v kontextu farmy databázových klientů, měli byste vidět, proč tam části jsou a proč by jejich odstranění mohlo vést k rozpadu ObjectId generace.

Navrhoval bych, abyste implementovali algoritmus pro vytvoření jedinečného čísla a jeho uložení do databáze. Je to dost jednoduché. Má to trochu vliv na výkon, ale je to bezpečné.

Napsal jsem toto před chvílí odpovědět na problémy spojené s používáním ObjectId v adrese URL. Obsahuje odkaz na to, jak vytvořit jedinečné automatické navyšující číslo pomocí MongoDB.



  1. Nelze načíst hodnotu _id pomocí mgo s golang

  2. Jak odstranit sloupec z podřízené kolekce

  3. Výsledek dotazování od mongoose pomocí dynamického modelu.find

  4. Rozdíly mezi Microsoft.Extensions.Cashing.Redis a Microsoft.Extensions.Caching.StackExchangeRedis.RedisCache