Četl jsem nejčastější chyby v návrhu databáze, které udělal vývojář Q & A na stackoverflow. Při první odpovědi byla fráze o exkluzivním oblouku:
Exkluzivní oblouk je běžná chyba, když je tabulka vytvořena se dvěma nebo více cizími klíči, kde jeden a pouze jeden z nich může mít nenulovou hodnotu. Velká chyba. Za prvé je mnohem obtížnější udržovat integritu dat. Koneckonců, ani při referenční integritě nic nebrání tomu, aby byly nastaveny dva nebo více těchto cizích klíčů (bez ohledu na komplexní kontrolní omezení).
Opravdu ne „Nechápu, proč je výlučný oblouk zlý. Pravděpodobně jsem nepochopil jeho základní principy. Existuje nějaké dobré vysvětlení pro exkluzivní oblouky?
Odpověď
Pokud jsem tomu rozuměl už dávno, v exkluzivním oblouk tabulka obsahuje několik sloupců, které jsou cizími klíči pro jiné tabulky, ale současně lze nastavit pouze jeden z nich (kvůli logickému omezení domény vyplývajícímu ze skutečného světa). Protože toto pravidlo nelze v databázi vynutit, mohl by být vytvořen poškozený záznam, kde má hodnotu více než jeden z těchto cizích klíčů.
Udělám příklad. Zvažte aplikaci, kde společnost sleduje kamiony, které používá k doručování zboží. Kamion může být současně pouze na jednom ze tří míst: může být se zaměstnancem, může být v parkovací garáži nebo v údržbářské dílně. tím, že bude mít Truck-table s employeeId, parkingGarageId a maintenanceShopId, odkazující na tabulky Employee, ParkingGarage a MaintenanceShop. Neexistuje žádný způsob, jak vynutit pravidlo, že na úrovni databáze je vyplněno pouze jedno z těchto polí. Špatný kód nebo někdo s přímým přístupem do databáze by mohl vložit záznam, který má vyplněná dvě nebo tři pole, což vede k poškození dat v databázi.
Komentáře
Odpověď
Na exkluzivních obloucích není nic zlého. Jednoduše vynuťte odpovídající obchodní pravidlo pomocí omezení kontroly. Většina hlavních systémů pro správu databází podporuje kontrolní omezení (Oracle, SQL Server, PostgreSQL). Pokud „používáte nástroj pro modelování dat, je velká šance, že váš nástroj automaticky vygeneruje kód pro implementaci omezení kontroly.
Odpovědět
Exkluzivní oblouk je velmi užitečný v koncepčním nebo logickém designu. Neznamená to, že je nutné implementovat tento způsob. V dřívějším příkladu se návrhář může rozhodnout implementovat design se třemi tabulkami. Jeden pro parkování umístění, jedno pro zaměstnance a druhé pro obchod s údržbou.
alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null))
. Nelíbí se mi ' exkluzivní oblouky, ale lze je vynutit omezením kontroly. Samozřejmě musí být také přítomno omezení FK.