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)