Anda menerapkan Entity-Attribute-Value antipola. Ini tidak bisa menjadi desain database yang dinormalisasi, karena tidak relasional.
Apa yang saya sarankan sebagai gantinya adalah Pewarisan Tabel Kelas pola desain:
- Buat satu tabel untuk Organisme, yang berisi properti umum untuk semua spesies.
-
Buat satu tabel per spesies, yang berisi properti khusus untuk spesies tersebut. Masing-masing tabel ini memiliki hubungan 1-ke-1 dengan Organisme, tetapi setiap properti termasuk dalam kolomnya sendiri.
____________________ ____________________ | 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) | |.... | |______________________|
Ini berarti Anda akan membuat banyak tabel, tetapi pertimbangkan ini sebagai pertukaran dengan banyak manfaat praktis untuk menyimpan properti dengan cara yang benar secara relasional:
- Anda dapat menggunakan tipe data SQL dengan tepat, alih-alih memperlakukan semuanya sebagai varchar bentuk bebas.
- Anda dapat menggunakan batasan atau tabel pencarian untuk membatasi properti tertentu dengan sekumpulan nilai yang telah ditentukan sebelumnya.
- Anda dapat membuat properti wajib (yaitu NOT NULL) atau menggunakan batasan lain.
- Data dan indeks disimpan dengan lebih efisien.
- Kueri lebih mudah Anda tulis dan RDBMS lebih mudah dijalankan.
Untuk lebih lanjut tentang desain ini, lihat buku Martin Fowler Pola Arsitektur Aplikasi Perusahaan , atau presentasi saya Model Berorientasi Objek Praktis dalam SQL , atau buku saya, SQL Antipatterns:Menghindari Perangkap Pemrograman Basis Data .