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:
- 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.
- Vytvořte jedinečné omezení pro BuildingID + BuildingType
- 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:
- 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.