Implementujete Entity-Attribute-Value antivzorec. Toto nemůže být návrh normalizované databáze, protože není relační.
Místo toho bych navrhl dědění tabulky tříd návrhový vzor:
- Vytvořte jednu tabulku pro organismy, která bude obsahovat vlastnosti společné všem druhům.
-
Vytvořte jednu tabulku pro každý druh obsahující vlastnosti specifické pro daný druh. Každá z těchto tabulek má vztah 1:1 s organismy, ale každá vlastnost patří do vlastního sloupce.
____________________ ____________________ | Organisms | | Species | |--------------------| |--------------------| |OrganismId (int, PK)| |SpeciesId (int, PK) | |SpeciesId (int, FK) |∞---------1|Name (varchar) | |Name (varchar) | |____________________| |____________________| 1 | | 1 ______________________ | HumanOrganism | |----------------------| |OrganismId (int, FK) | |Sex (enum) | |Race (int, FK) | |EyeColor (int, FK) | |.... | |______________________|
To sice znamená, že vytvoříte mnoho tabulek, ale považujte to za kompromis s mnoha praktickými výhodami ukládání vlastností relativně správným způsobem:
- Můžete vhodně použít datové typy SQL, místo abyste vše považovali za volně tvarovaný varchar.
- Můžete použít omezení nebo vyhledávací tabulky k omezení určitých vlastností pomocí předem definované sady hodnot.
- Vlastnosti můžete nastavit jako povinné (tj. NENULL) nebo použít jiná omezení.
- Data a indexy se ukládají efektivněji.
- Dotazy se snáze píší a RDBMS snáze spouští.
Další informace o tomto návrhu najdete v knize Martina Fowlera Patterns of Enterprise Application Architecture , nebo moje prezentace Praktické objektově orientované modely v SQL , nebo moje kniha, SQL Antipatterns:Vyhýbání se nástrahám databázového programování .