我会把这个作为答案,因为我认为这是一个设计缺陷。
首先,如果两个表之间是真正的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对应的最佳Child(基于定义的计算结果)。
这样做可以吗?
Parent
id
PRIMARY KEY: id
Child
id
parentid
... other data
PRIMARY KEY: id
FOREIGN KEY: parentid
REFERENCES Parent(id)
UNIQUE KEY: (id, parentid)
BestChild
parentid
childid
... other data
PRIMARY KEY: parentid
FOREIGN KEY: (childid, parentid)
REFERENCES Child(id, parentid)
这样做可以实现所需的引用完整性(每个BestChild都是Child,每个Parent只有一个BestChild),并且在References中没有循环路径。最佳子项的引用存储在额外的表中,而不是Parent表中。
您可以通过连接找到每个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)
1:1
关系,为什么不只有一个表呢? - ypercubeᵀᴹ