U implementeert de Entity-Attribute-Value antipatroon. Dit kan geen genormaliseerd databaseontwerp zijn, omdat het niet relationeel is.
Wat ik in plaats daarvan zou willen voorstellen is de Class Table Inheritance ontwerppatroon:
- Maak één tabel voor organismen, met eigenschappen die alle soorten gemeen hebben.
-
Maak per soort één tabel met eigenschappen die specifiek zijn voor die soort. Elk van deze tabellen heeft een 1-op-1 relatie met Organismen, maar elke eigenschap hoort thuis in zijn eigen kolom.
____________________ ____________________ | 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) | |.... | |______________________|
Dit betekent dat u veel tabellen zult maken, maar beschouw dit als een afweging met de vele praktische voordelen om eigenschappen op een relationeel correcte manier op te slaan:
- Je kunt SQL-gegevenstypen op de juiste manier gebruiken, in plaats van alles als een vrije vorm varchar te behandelen.
- U kunt beperkingen of opzoektabellen gebruiken om bepaalde eigenschappen te beperken met een vooraf gedefinieerde set waarden.
- U kunt eigenschappen verplicht maken (d.w.z. NIET NULL) of andere beperkingen gebruiken.
- Gegevens en indexen worden efficiënter opgeslagen.
- Query's zijn gemakkelijker voor u om te schrijven en gemakkelijker voor het RDBMS om uit te voeren.
Zie voor meer informatie over dit ontwerp het boek van Martin Fowler Patterns of Enterprise Application Architecture , of mijn presentatie Praktische objectgeoriënteerde modellen in SQL , of mijn boek, SQL-antipatronen:de valkuilen van databaseprogrammering vermijden .