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

desain database MySQL. Menyisipkan baris dalam tabel 1to1.

Saya akan menjadikan ini sebagai jawaban karena saya merasa ini adalah cacat desain.

Pertama, jika kedua tabel benar 1:1 hubungan, kenapa tidak Anda hanya memiliki satu meja?

Kedua, jika itu bukan 1:1 yang benar hubungan tetapi masalah supertipe-subtipe, Anda juga tidak memerlukan kunci asing melingkar ini. Katakanlah table1 adalah Employee dan table2 adalah Customer . Tentu saja sebagian besar pelanggan bukanlah karyawan (dan sebaliknya). Tetapi terkadang pelanggan juga bisa menjadi karyawan. Ini dapat diselesaikan dengan memiliki 3 tabel:

Person
------
id
PRIMARY KEY: id

Employee
--------
personid
lastname
firstname
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
    REFERENCES Person(id)

Customer
--------
personid
creditCardNumber
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
    REFERENCES Person(id)

Dalam skenario yang Anda gambarkan, Anda memiliki dua tabel Parent dan Child memiliki 1:N hubungan. Kemudian, Anda ingin menyimpan anak dengan performa terbaik (berdasarkan perhitungan yang ditentukan) untuk setiap orang tua.

Apakah ini akan berhasil?:

Parent
------
id
PRIMARY KEY: id

Child
-----
id
parentid
... other data
PRIMARY KEY: id
FOREIGN KEY: parentid
    REFERENCES Parent(id)
UNIQUE KEY: (id, parentid)             --- needed for the FK below

BestChild
---------
parentid
childid
... other data
PRIMARY KEY: parentid
FOREIGN KEY: (childid, parentid)
    REFERENCES Child(id, parentid)

Dengan cara ini, Anda menerapkan integritas referensial yang diinginkan (setiap BestChild adalah Child, setiap Parent hanya memiliki satu BestChild) dan tidak ada jalur melingkar di References. Referensi ke anak terbaik disimpan di tabel tambahan dan bukan di Parent meja.

Anda dapat menemukan BestChild untuk setiap Orang Tua dengan bergabung:

Parent
  JOIN BestChild
    ON Parent.id = BestChild.parentid
  JOIN Child
    ON BestChild.childid = Child.id

Selain itu, jika Anda ingin menyimpan anak terbaik untuk beberapa tes kinerja (untuk berbagai jenis tes, atau tes di berbagai tanggal), Anda dapat menambahkan test bidang, dan ubah Kunci Utama menjadi (test, parentid) :

BestChild
---------
testid
parentid
childid
... other data
PRIMARY KEY: (testid, parentid)
FOREIGN KEY: (childid, parentid)
    REFERENCES Child(id, parentid)
FOREIGN KEY: testid
    REFERENCES Test(id)


  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 memesan dengan duplikat atas terlebih dahulu

  2. MySQL tidak menggunakan indeks pada DATE saat digunakan dengan operator '<' atau '>'?

  3. Apa pendekatan terbaik untuk membuat kueri dinamis (menggunakan PHP+MySQL)?

  4. Bisakah saya menggunakan fungsi MySQL di LIMIT offset?

  5. Autostart Server MySQL di Mac OS X Yosemite/El Capitan