it-swarm-eu.dev

Guid vs INT - Který je lepší jako primární klíč?

Četl jsem důvody, proč používat nebo ne Guid a int.

int je menší, rychlejší, snadno zapamatovatelný, udržuje chronologickou sekvenci. A pokud jde o Guid, jediná výhoda, kterou jsem našel, je, že je jedinečný. V tom případě by Guid bylo lepší než a int a proč?

Z toho, co jsem viděl, nemá int žádné nedostatky, kromě limitu počtu, který je v mnoha případech irelevantní.

Proč přesně byl vytvořen Guid? Vlastně si myslím, že to má jiný účel než sloužit jako primární klíč jednoduché tabulky. (Nějaký příklad skutečné aplikace používající Guid pro něco?)

(Guid = UniqueIdentifier) ​​typ na serveru SQL

107
BrunoLM

To bylo požadováno v zásobníku Přetečení zde a zde .

Jeffův příspěvek vysvětluje hodně o výhodách a nevýhodách používání GUID.

GUID Pros

  • Unikátní v každé tabulce, každé databázi a na každém serveru
  • Umožňuje snadné sloučení záznamů z různých databází
  • Umožňuje snadnou distribuci databází na více serverech
  • ID můžete generovat kdekoli, namísto toho, abyste se museli vrátit zpět do databáze
  • Většina scénářů replikace vyžaduje sloupce GUID)

GUID Nevýhody

  • Je to neuvěřitelných 4krát větší než tradiční hodnota 4bajtového indexu; pokud si nejste opatrní, může to mít vážný dopad na výkon a úložiště
  • Je obtížné ladit (where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • Vygenerované identifikátory GUID by měly být částečně sekvenční, aby bylo dosaženo co nejlepšího výkonu (např. newsequentialid() na serveru SQL Server 2005+) a aby bylo možné používat seskupené indexy

Pokud jste si jisti výkonem a neplánujete replikovat nebo slučovat záznamy, použijte int a nastavte to auto increment ( identity seed in SQL Server ).

94
CoderHawk

Pokud synchronizujete data s externím zdrojem, může být perzistentní GUID GUID $ ===) mnohem lepší. Rychlým příkladem toho, kde používáme GUID, je nástroj, který je odeslán zákazníkovi na procházet jejich síť a provádět určité třídy automatického vyhledávání, ukládat nalezené záznamy a poté jsou všechny záznamy zákazníků integrovány do centrální databáze zpět na našem konci. Pokud bychom použili celé číslo, měli bychom 7 398 "1" a bylo by mnohem těžší sledovat, které z nich bylo „1“.

19
TML

Úspěšně jsem použil hybridní přístup. Tabulky obsahují BOTH sloupec id s automatickým přírůstkem a sloupec guid. guid lze použít podle potřeby pro globální jedinečnou identifikaci řádku a id lze použít pro dotazy, třídění a identifikaci člověka na řádku.

18
rmirabelle

Některé doporučené postupy tam stále uvádějí, že byste měli použít datový typ, který s menší možnou pamětí přizpůsobí celou sadu hodnot, které budete používat. Například, pokud jej používáte k ukládání počtu zaměstnavatelů v malém podniku a je nepravděpodobné, že byste se dostali ke 100, pak by nikdo nenavrhoval použití bigintové hodnoty, zatímco int (i smallint) by to udělal.

Nevýhodou je samozřejmě jako „Řekni ne škálovatelnosti!“


Také vím, že to není úplně spřízněné, ale je tu ještě další faktor. Pokud to není příliš velké, obvykle se pokusím doporučit použít neautogenerovaný primární klíč, pokud to má smysl. Pokud například ukládáte informace o ovladači, neobtěžujte se ve vytváření nového automaticky generovaného sloupce pro „ID“, stačí použít licenční číslo.

Vím, že to zní opravdu zřetelně, ale vidím, že jsem na to zapomněl docela často.

Pro kontext: tato část odpovědi byla adresována z datově teoretického přístupu, kde chcete, aby váš PK byl jedinečným identifikátorem dat pro záznam. Většinu času vytváříme ty, které již existují, tedy předchozí odpověď.

Je však velmi vzácné, že můžete mít přísnou kontrolu nad těmito datovými body, a proto bude možná nutné provést opravy nebo úpravy. Nemůžete to udělat pomocí primárních klíčů (dobře, můžete, ale může to být bolest).

Díky @VahiD za vysvětlení.

1
Alpha

Používání automatických ID přírůstků může vést k úniku informací o vaší obchodní činnosti. Pokud provozujete obchod a používáte order_id veřejně identifikovat nákup, pak kdokoli může zjistit váš měsíční počet prodejů jednoduchou aritmetikou.

1
golopot

@rmirrabelle odpověď výše - https://dba.stackexchange.com/a/96990/118371 co dělám. U projektů ve větším měřítku však existuje dokonalý design.

Použití: Tabulka mapování klíčů

TableA

- ID int (PK)
- Data varchar(100)

TableAMap

- ID int (PK)
- UniversalID GUID (Indexed - nonclustered)

Jak ostatní diskutovali v tomto vlákně, GUID jsou zřídka potřeba pro replikaci/import/exprt databáze. Takže namísto toho, aby měl v hlavní tabulce GUID), kde zabírá dalších 8 bajtů na řádek a kde bude index GUID) ve výchozím nastavení) uložené na stejném svazku, k záchraně přichází samostatná tabulka (aka normalizace).

Se samostatnou tabulkou mohou vaše databáze DBA volně ukládat na jiný pomalejší disk. Také, pokud GUID je POUZE potřeba pro určité dávkové úlohy), můžete vytvořit index GUID těsně před tím, než je potřeba) a poté jej zahodit.

0
Todd

Další věc s tím, jak jsou generovány GUID. mrdenny správně poukázal na to, že i když se používá newsequentialid (), restartování instancí způsobí, že nové hodnoty začínají „díry“, které zůstaly v předchozím zpracování. Další věcí, která ovlivňuje „sekvenční“ GUID, je síťová karta. Pokud si dobře pamatuji, UID NIC) se používá jako součást algoritmu GUID GUID $ ===). Pokud je NIC je Nahrazeno, neexistuje žádná záruka, že UID bude vyšší hodnota pro zachování sekvenčního aspektu věcí. Nejsem si také jistý, jak více NIC může ovlivnit přiřazení hodnot pomocí algoritmu.

Jen myšlenka a doufám, že si dobře pamatuji. Měj krásný zbytek dne!

0
bobo8734