Udzielę odpowiedzi, ponieważ uważam, że jest to wada projektu.
Po pierwsze, jeśli dwie tabele mają wartość true 1:1
związek, dlaczego nie masz tylko jednego stolika?
Po drugie, jeśli nie jest to prawda 1:1
związek, ale problem nadtypu-podtypu, nie potrzebujesz też tych okrągłych kluczy obcych. Powiedzmy table1
jest Employee
i table2
to Customer
. Oczywiście większość klientów to nie pracownicy (i odwrotnie). Ale czasami klient może być również pracownikiem. Można to rozwiązać za pomocą 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)
W scenariuszu, który opisujesz, masz dwie tabele Parent
i Child
mając 1:N
relacja. Następnie chcesz w jakiś sposób przechowywać najskuteczniejsze (w oparciu o zdefiniowane obliczenia) dziecko dla każdego rodzica.
Czy to zadziała?:
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)
W ten sposób wymuszasz pożądaną integralność referencyjną (każde BestChild jest Dzieckiem, każdy Rodzic ma tylko jedno BestChild) i nie ma okrężnej ścieżki w Referencjach. Odniesienie do najlepszego dziecka jest przechowywane w dodatkowej tabeli, a nie w Parent
stół.
Możesz znaleźć BestChild dla każdego rodzica, dołączając:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Dodatkowo, jeśli chcesz przechowywać najlepsze dzieci dla wielu testów wydajności (dla różnych typów testów lub testów w różnych terminach), możesz dodać test
i zmień klucz podstawowy na (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)