Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL:Normalisasi database sambil mempertahankan batasan

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat memasukkan nilai eksplisit untuk kolom identitas dalam tabel 'tabel' ketika IDENTITY_INSERT disetel ke OFF

  2. SQL Server convert pilih kolom dan ubah menjadi string

  3. Periksa apakah suatu parameter nol atau kosong dalam prosedur tersimpan

  4. Statistik Penggunaan Indeks SQL Server

  5. Cara mendapatkan hari pertama dan terakhir bulan sebelumnya (dengan stempel waktu) di SQL Server