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

Apakah ada cara untuk mempertahankan hubungan db (pk/fk) dalam skenario berikut

Desain Anda tidak "tampak" apa-apa karena kami tidak bisa membaca pikiran Anda. Anda telah memberikan beberapa aspek desain tetapi bukan "skenario" bisnis yang diwakili/diimplementasikan/dijelaskan atau bagaimana melakukannya.

SQL NULL, UNIQUE, PK &FK adalah jenis kendala. Batasan adalah batasan pada nilai basis data apa yang dapat muncul. FK SQL mengatakan nilai subbaris untuk daftar kolom dalam tabel harus muncul di tempat lain untuk daftar kolom yang kolomnya membentuk kumpulan kolom SQL UNIQUE NOT NULL (yang merupakan kasus PK) di tabel mereka. Jika desain Anda tunduk pada batasan dan tidak tersirat oleh batasan lain yang dipaksakan, terapkan. Jika tidak, jangan. Sebaiknya secara deklaratif. Sebagian besar DBMS SQL hanya mengizinkan Anda mendeklarasikan beberapa jenis batasan yang murah untuk diterapkan. Lainnya harus ditegakkan melalui pemicu.

Batasan adalah konsekuensi dari kriteria untuk baris yang masuk vs keluar dari tabel dalam situasi tertentu (tabel predikat , "apa arti tabel") dan situasi apa yang dapat &tidak dapat muncul sesuai dengan aturan bisnis Anda. Kami tidak tahu apa itu kecuali Anda memberi tahu kami. Kami berharap dapat menebak dengan menggunakan nama tabel &kolom Anda, info lain yang Anda berikan &akal sehat.

Kamu harus memberi tahu kami baik kendala atau predikat &situasi apa yang bisa/tidak bisa muncul.

Di sini tabel Anda menggunakan tabel langsung ditambah beberapa desain EAV untuk merekam data beberapa tabel sederhana yang tidak secara eksplisit dalam desain Anda. Seperti biasa Anda bisa hindari EAV hanya dengan menggunakan DDL untuk menjaga agar skema &batasan tabel langsung tetap mutakhir, tetapi sebaliknya Anda telah memilih skema statis yang memerlukan skema, kueri &batasan yang lebih kompleks. Ekspresi langsung dari kendala EAV biasanya bahwa tabel langsung yang mereka wakili memiliki kendala tertentu ditambah bahwa t_criteria_x adalah tampilannya dan/atau itu adalah tampilannya. Tapi biasanya satu-satunya deklarasi SQL yang tersedia hanya memungkinkan Anda mengekspresikan fragmen itu.

Saya tebak bahwa apa yang Anda maksudkan di sini termasuk bahwa untuk setiap tabel t_criteria_x nilai PK-nya harus muncul di t_criteria_director dengan nilai table_name 't_criteria_x'. Cara lain untuk menempatkan ini adalah bahwa jika Anda menambahkan ke t_criteria_x kolom table_name dengan nilai 't_criteria_x' maka hasilnya harus memiliki subbaris (id, table_name) yang muncul sebagai t_criteria_director (criteria_id, table_name) subrows. Jika juga t_criteria_director (criteria_id, table_name) subrows adalah SQL UNIQUE NOT NULL maka kami memiliki bahwa augmented t_criteria_x memiliki komposit SQL FK (id, table_name) yang merujuk t_criteria_director (criteria_id, table_name). Anda dapat menyatakan ini secara deklaratif dengan benar-benar menambah t_criteria_x dengan kolom (mungkin dihitung/dihasilkan/dihitung). Tetapi Anda mungkin juga memiliki kendala lain, seperti tidak ada pasangan (constraint_id, table_name) di t_criteria_director yang tidak dirujuk oleh beberapa t_constraint_x yang ditambah.

Memanggil nama_tabel kolom menunjukkan bias berorientasi implementasi dari EAV karena kolom tersebut adalah jenis/varian pembeda/tag dalam pengertian ER bahwa tipe entitas yang diwakili oleh id dalam tabel t_criteria_x adalah "subtipe" dari tipe entitas yang diwakili oleh t_criteria_director. (Ini juga merupakan konsep/teknik dari struktur data record 3GL yang digunakan untuk simulasi pengetikan secara dinamis.) Setelah semua nilai kolom table_name tidak harus berupa nama tabel, itu hanya harus beberapa nilai yang mengidentifikasi subtipe entitas, dan entitas seperti itu tidak harus hanya berpartisipasi dalam hubungan/asosiasi satu tabel. (Riset SQL/database/ER subtyping/polymorphism/inheritance dan design anti-pattern two/many/multiple FKs [sic] to two/many/multiple tables.)

Anda harus menentukan apa predikat tabel itu dan apa kendalanya. Lebih disukai dengan menentukan apa tabel langsung yang mereka wakili secara kolektif &apa predikatnya dan apa batasan basis data yang menggunakannya. Kemudian Anda harus memutuskan apakah per biaya/manfaat Anda akan memodifikasi desain Anda untuk membuat batasan deklaratif dan/atau Anda akan menerapkan batasan melalui pemicu atau tidak.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL TIDAK DALAM permintaan

  2. Apa perbedaan antara MySQL, MySQLi dan PDO?

  3. Cara menampilkan data Unicode dengan PHP

  4. Kesalahan fatal:Waktu eksekusi maksimum 30 detik terlampaui di C:

  5. PHP loop bertindak sebagai cronjob [pastikan hanya satu instance yang berjalan]