sql >> Databáze >  >> RDS >> Mysql

Za jakých podmínek potřebujeme v databázi použít složené klíče

Složené klíče by nikdy neměly být brány v úvahu v „nových“ aplikacích. Používali je v minulosti lidé, kteří si mysleli, že „obchodní klíče“ jsou lepší než „náhradní klíče“.

Edit:Jak se zeptal Chris, rozšiřuji svou odpověď.

Dovolte mi začít tím, že tuto otázku chápu jako „složené primární klíče“ vs. „náhradní klíče“.

Také připouštím, že existuje jeden případ použití, kdy má složený klíč smysl:v tabulkách křížových odkazů, nazývaných také „tabulky odkazů“. Ty se používají v tabulkách many-to-many a obsahují pouze dvě pole, obě cizí klíče, které tvoří primární klíč pro tabulku xref. Například UserRole tabulka by obsahovala user_id a role_id , nic jiného. Například v Javě neexistuje žádná reprezentace třídy pro tabulku, jako je tato. Obvykle je to @ManyToMany , s Collection na obou stranách.

Sdílel jsem své názory na přirozené klíče vs. náhradní klíče v jiné odpovědi ( Hibernate :Názory na kompozitní PK vs náhradní PK ) a věřím, že složené klíče sdílí některé nevýhody přirozeného klíče, aniž by přinášely nějaké skutečné výhody.

Problém složených klíčů je, že budete potřebovat dva hodnoty pro jednoznačnou identifikaci záznamu. To se stává problémem, jakmile začnete mít tabulky, které odkazují na záznamy v této první tabulce. Druhá tabulka pak potřebuje dvě sloupců, aby bylo možné odkazovat na jeden záznam. A pokud tato druhá tabulka používá složený klíč složený z jedné hodnoty + cizího klíče, máte nyní tři sloupce k jednoznačné identifikaci jeden záznam. A třetí stůl by potřeboval tyto tři další sloupce pouze pro odkaz na jeden záznam ve druhé tabulce. Opravdu, tohle je sněhová koule.

Další nevýhodou je, že požadavky dělají změna. Po celou dobu. Takže to, co se dnes zdá být dobrým složeným klíčem, nebude zítra vůbec klíčem. Proto máme náhradní klíče:abychom byli připraveni na budoucnost.

Složené klíče se používají hlavně proto, aby záznamy v tabulce byly jedinečné na základě sady sloupců. Například pokud máte Customers tabulky, můžete mít NationalId +Country jako jedinečnou hodnotu, což znamená, že dva uživatelé nemohou sdílet stejné SSN, pokud je jejich zemí USA. Ale je možné mít stejné číslo pro dva záznamy, pokud nejsou ve stejné zemi. Pokud máte rádi kompozitní klíče, byl by to dobrý kandidát. Ale jak jsem naznačil dříve, můžete použít náhradní klíč a použít unique omezení. Získáte výhody kompozitního klíče plus bezpečnost náhradního klíče.



  1. Proč je tento dotaz INNER JOIN/ORDER BY mysql tak pomalý?

  2. PHP:Načítání obrázků z MySQL Blob přímo do tagu <img>

  3. Jak převést SQL Query na Rails Active Record Query?

  4. AT TIME ZONE – nová oblíbená funkce v SQL Server 2016