Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Perbedaan antara dua struktur tabel

Antipola?

Dalam kasus umum, tabel kedua adalah anti-pola dalam konteks desain database. Dan, terlebih lagi, ia memiliki nama khusus:Entity-Attribute-Value (EAV). Ada beberapa kasus, ketika menggunakan desain ini dibenarkan, tetapi itu adalah kasus yang jarang terjadi - dan bahkan hal itu dapat dihindari.


Mengapa EAV buruk

Dukungan integritas data

Terlepas dari kenyataan bahwa struktur seperti itu tampaknya lebih "fleksibel" atau "maju", desain ini memiliki kelemahan.

  • Mustahil membuat atribut wajib . Anda tidak dapat membuat beberapa atribut wajib, karena atribut sekarang disimpan sebagai baris - dan satu-satunya tanda bahwa atribut tidak disetel - adalah bahwa baris yang sesuai tidak ada dalam tabel. SQL tidak akan mengizinkan Anda membuat batasan seperti itu secara asli - jadi, Anda harus memeriksanya di aplikasi - dan, ya, meminta tabel Anda setiap kali
  • Pencampuran tipe data . Anda tidak akan dapat menggunakan tipe data standar SQL. Karena kolom nilai Anda harus berupa "tipe super" untuk semua nilai yang tersimpan di dalamnya. Artinya - secara umum Anda harus menyimpan semua data sebagai string mentah . Kemudian Anda akan melihat betapa menyakitkan bekerja dengan tanggal seperti halnya dengan string, setiap kali mentransmisikan tipe data, memeriksa integritas data, dll.
  • Tidak mungkin menegakkan integritas referensial . Dalam situasi normal, Anda dapat menggunakan kunci asing untuk membatasi nilai-nilai Anda, yang didefinisikan dalam tabel induk. Tetapi tidak dalam kasus ini - itu karena integritas referensial diterapkan ke setiap baris dalam tabel, tetapi tidak untuk nilai baris. Jadi - Anda akan kehilangan keuntungan ini - dan ini salah satu hal mendasar dalam kaitannya dengan DB
  • Tidak mungkin menyetel nama atribut . Itu berarti - Anda tidak dapat membatasi nama atribut pada level DB dengan benar. Misalnya, Anda akan menulis "customer_name" sebagai nama atribut dalam kasus pertama - dan pengembang lain akan melupakannya dan menggunakan "name_of_customer" . Dan.. tidak apa-apa, DB akan melewati itu dan Anda akan berakhir dengan berjam-jam yang dihabiskan untuk men-debug kasus ini.

Rekonstruksi baris

Selain itu, rekonstruksi baris akan sangat buruk dalam kasus umum. Jika Anda memiliki, misalnya, 5 atribut - itu akan menjadi 5 tabel mandiri JOIN -s. Sayang sekali untuk kasus sederhana - sekilas - seperti itu. Jadi saya bahkan tidak ingin membayangkan bagaimana Anda akan mempertahankan 20 atribut.


Bisakah dibenarkan?

Maksud saya adalah - tidak. Di RDBMS akan selalu ada cara untuk menghindari ini. Ini mengerikan. Dan jika EAV dimaksudkan untuk digunakan, maka pilihan terbaik mungkin non-relasional database.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendeteksi karakter rusak utf8 di MySQL

  2. Hibernate 5:- org.hibernate.MappingException:Entitas tidak dikenal

  3. mySQL mengembalikan indeks setelah dimasukkan

  4. Grup Karbon Laravel berdasarkan Bulan

  5. Bagaimana cara menentukan apakah menggunakan SSL dalam Koneksi MySql?