我会回答这个问题,因为我觉得这是一个设计缺陷。
首先,如果两张表是真正的1:1
关系,为什么不只有一张表呢?
其次,如果它不是一个真正的1:1
关系而是一个超类型-子类型问题,你也不需要这个循环外键。让我们说table1
是Employee
和table2
是Customer
。当然,大多数客户不是员工(反之亦然)。但有时客户也可能是员工。这可以通过 3 个表来解决:
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)
在您描述的场景中,您有两个表Parent
并且Child
有1:N
关系。然后,您希望以某种方式为每个父级存储表现最佳(基于定义的计算)的子级。
这行得通吗?:
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)
通过这种方式,您可以强制执行所需的参照完整性(每个 BestChild 都是一个 Child,每个 Parent 只有一个 BestChild)并且 References 中没有循环路径。对最佳孩子的引用存储在额外的表中,而不是存储在Parent
表中。
您可以通过以下方式为每位家长找到 BestChild:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
此外,如果您想为多个性能测试(针对不同类型的测试或不同日期的测试)存储最佳子项,您可以添加一个test
字段,并将主键更改为(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)