Co je to exkluzivní oblouk v databázi a proč je ' zlý?

Č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

  • Tři možná umístění nákladních vozidel jsou podtřídy nadtřídy, " umístění kamionu ". Existuje mnoho případů, kdy se podtřídy vzájemně vylučují. Výzvou se stává modelování tříd a podtříd v relačních tabulkách.
  • Souhlasím s tím, že existují případy, kdy je použití tohoto návrhu oprávněné. Mohu však také souhlasit s původním příspěvkem, že tento vzor je používán mnohem více, než by měl. Má také některé velmi velké nevýhody …
  • Nelze použít kontrolní omezení? Například 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.
  • Proto " komplexní kontrolní omezení bez ohledu na " z příspěvku citováno výše. Možná budete moci provádět opravdu sofistikované ověřování s omezeními kontroly nebo sakra, dokonce i spouštěči, což z něj ' nedělá dobrý nápad nebo známku dobrého designu. Představte si, že děláte kontrolní omezení na exkluzivních obloucích se čtyřmi nebo pěti sloupci … Také jsem si ' docela jistý, že ne všechny databázové stroje podporovat omezení CHECK . MySQL v dokumentech výslovně uvádí, že klauzule CHECK jsou analyzovány, ale ignorovány …
  • Tento zdroj doporučuje exkluzivní oblouk. Myšlenky?

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *