Du er ved at implementere Entity-Attribute-Value antimønster. Dette kan ikke være et normaliseret databasedesign, fordi det ikke er relationelt.
Det, jeg vil foreslå i stedet, er Klassebordsarv designmønster:
- Opret én tabel for organismer, der indeholder egenskaber, der er fælles for alle arter.
-
Opret én tabel pr. art, der indeholder egenskaber, der er specifikke for den pågældende art. Hver af disse tabeller har et 1-til-1 forhold til organismer, men hver egenskab hører til i sin egen kolonne.
____________________ ____________________ | 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) | |.... | |______________________|
Det betyder, at du vil oprette mange tabeller, men betragte dette som en afvejning med de mange praktiske fordele ved at opbevare egenskaber på en relationelt korrekt måde:
- Du kan bruge SQL-datatyper på passende måde i stedet for at behandle alt som frit varchar.
- Du kan bruge begrænsninger eller opslagstabeller til at begrænse visse egenskaber med et foruddefineret sæt værdier.
- Du kan gøre egenskaber obligatoriske (dvs. IKKE NULL) eller bruge andre begrænsninger.
- Data og indekser gemmes mere effektivt.
- Forespørgsler er nemmere for dig at skrive og nemmere for RDBMS at udføre.
For mere om dette design, se Martin Fowlers bog Patterns of Enterprise Application Architecture , eller min præsentation Praktiske objektorienterede modeller i SQL , eller min bog, SQL Antipatterns:Avoiding the Pitfalls of Database Programming .