作者:瑶瑶bao呗 | 来源:互联网 | 2023-09-13 13:29
将行插入到彼此引用为1对1的表中的最佳方法是什么?我的意思是,在MySQL5.5和表InnoDB中,我有一个类似于以下的数据库设计当我们尝试在table1和table2中插入行时出
将行插入到彼此引用为1对1的表中的最佳方法是什么?
我的意思是,在MySQL 5.5和表InnoDB中,我有一个类似于以下的数据库设计
当我们尝试在table1和table2中插入行时出现问题.由于MySQL中没有多表插入,因此我不能插入一行,因为两个表中的外键都是NOT NULL字段,并且应该同时插入两个表中.
哪个是解决这个问题的方法?
我想到了3个可能的解决方案,但我想知道是否有更多这些或哪个是最好的以及为什么.
>将外键字段设置为NULLABLE,在表中插入一行后插入另一行,然后更新de first.
>正如上面所示,但具有-1的特殊值.首先,在一个表中插入外键= -1,该表等效于NULL,但避免将该字段设置为NULLABLE.然后,我们在另一个表中插入行并更新插入的第一行.
>在两者之间创建关系表虽然不是必需的,因为它是1比1的比率
谢谢!!
编辑
我简要解释一下我需要这个循环关系:它是从父表到其子节点之间的非规范化.按高性能顺序制作,始终引用父表中排名最高的子项.
解决方法:
我会做出这个答案,因为我觉得这是一个设计缺陷.
首先,如果两个表是真正的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中没有循循环径.对最佳子项的引用存储在额外表中,而不是父表中.
您可以通过加入为每个家长找到BestChild:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
此外,如果要为多个性能测试(针对不同类型的测试或不同日期的测试)存储最佳子项,则可以添加测试字段,并将主键更改为(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)