将行插入到彼此引用 1 到 1 的表中的最佳方法是什么?
我的意思是,在 MySQL 5.5 和表 InnoDB 中,我有一个类似于以下的数据库设计
当我们尝试在表 1 和表 2 中插入行时,问题就出现了。由于MySQL中没有多表插入,我不能插入一行,因为外键在两个表中都是NOT NULL字段,应该同时插入到两个表中。
解决这个问题的最佳方法是什么?
我想到了 3 种可能的解决方案,但我想知道是否有更多的解决方案,或者哪个是最好的以及为什么。
将外键字段设置为 NULLABLE,在表中插入一行后,插入另一行,然后更新第一行。
如上所示,但有一个特殊值,如 -1。首先,在一个表中插入相当于 NULL 的 foreign
key = -1
但避免将字段设置为 NULLABLE。之后,我们将行插入到另一个表中并更新插入的第一个。在两者之间创建一个关系表,虽然这并不是真的有必要,因为它是 1 比 1 的比例
谢谢!!
编辑 我简要解释一下我需要这种循环关系:它是从父表到它的一个子表的非规范化。它是为了高性能而设计的,总是从父表中获得排名最好的 child 的引用。
最佳答案
我认为这是一个设计缺陷,所以我会回答这个问题。
首先,如果两个表是真正的 1:1
关系,为什么不只有一个表?
其次,如果不是真正的1:1
关系而是父类(super class)型-子类型问题,您也不需要这个循环外键。假设 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) --- 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 中没有循环路径。对最佳 child 的引用存储在额外的表中,而不是在 Parent
表中。
您可以通过加入为每个 Parent 找到 BestChild:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
此外,如果你想为多个性能测试(针对不同类型的测试,或不同日期的测试)存储最好的 child ,你可以添加一个 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)
关于MySQL数据库设计。在 1to1 表中插入行。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6691366/