sql >> Databáze >  >> RDS >> Sqlserver

Cizí klíč odkazující na více tabulek

Možná budete chtít zvážit datový model Type/SubType. Toto je velmi podobné třídám/podtřídám v objektově orientovaném programování, ale implementace je mnohem nepohodlnější a žádný RDBMS (kterého znám) je nativně nepodporuje. Obecná myšlenka je:

  • Definujete typ (budovu), vytvoříte pro ni tabulku, dáte jí primární klíč
  • Definujete dva nebo více podtypů (zde, Nemocnice, Klinika, Škola, Univerzita), pro každý z nich vytvoříte tabulky, vytvoříte primární klíče… ale primární klíče jsou také cizí klíče, které odkazují na tabulku budovy
  • Vaši tabulku s jedním sloupcem „ObjectType“ lze nyní zabudovat pomocí cizího klíče do tabulky Building. Museli byste se připojit k několika stolům, abyste zjistili, o jaký druh budovy se jedná, ale stejně byste to museli udělat. To, nebo ukládat redundantní data.

Všimli jste si problému s tímto modelem, že? Co zabrání tomu, aby budova neměla záznamy ve dvou nebo více tabulkách podtypů? Jsem rád, že ses zeptal:

  1. Přidejte do budovy sloupec, například „BuildingType“, řekněme char(1) s povolenými hodnotami {H, C, S, U} označujícími (duh) typ budovy.
  2. Vytvořte jedinečné omezení pro BuildingID + BuildingType
  3. Mějte v podtabulkách sloupec BulidingType. Dejte na něj kontrolní omezení, aby mohl být vždy nastaven pouze na hodnotu (H pro tabulku Hospitals atd.) Teoreticky by to mohl být vypočítaný sloupec; v praxi to nebude fungovat kvůli následujícímu kroku:
  4. Vytvořte cizí klíč pro propojení tabulek pomocí obou sloupců

Voila:Vzhledem k tomu, že řádek BUILDING je nastaven s typem H, nelze položku v tabulce SCHOOL (s typem S) nastavit tak, aby odkazovala na tuto budovu

Pamatujete si, že jsem říkal, že je těžké to implementovat.

Ve skutečnosti je velká otázka:Stojí to za to dělat? Pokud má smysl implementovat čtyři (nebo více, postupem času) typy budov jako typ/podtyp (další výhody normalizace:jedno místo pro adresu a další atributy společné pro každou budovu, přičemž atributy specifické pro budovu jsou uloženy v podtabulkách), jeho vybudování a údržba může stát za to. Pokud ne, pak jste zpět na začátku:logický model, který je těžké implementovat v průměrném moderním RDBMS.



  1. Zahrnout výsledky null do group_concat

  2. Jak vytvořit databázi online z režimu obnovení na serveru SQL Server

  3. Zachovejte zalomení řádků z TextArea při zápisu do MySQL

  4. Spouštěč MySQL:SMAŽ z tabulky PO DELETE