Emi*_*lás 3 mysql database database-design insert relational-database
将行插入到彼此引用为1对1的表中的最佳方法是什么?
我的意思是,在MySQL 5.5和表InnoDB中,我有一个类似于以下的数据库设计

当我们尝试在table1和table2中插入行时出现问题.由于MySQL中没有多表插入,因此我不能插入一行,因为两个表中的外键都是NOT NULL字段,并且应该同时插入两个表中.
哪个是解决这个问题的方法?
我想到了3个可能的解决方案,但我想知道是否有更多这些或哪个是最好的以及为什么.
将外键字段设置为NULLABLE,并在表中插入一行后插入另一行,然后更新de first.
正如上面所指出的那样但是有一个像-1这样的特殊值.首先,在一个表中插入一个key = -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)
Run Code Online (Sandbox Code Playgroud)
在您描述的场景中,您有两个表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)
Run Code Online (Sandbox Code Playgroud)
这样,您可以强制执行所需的参照完整性(每个BestChild都是一个Child,每个Parent只有一个BestChild)并且References中没有循环路径.对最佳子项的引用存储在额外表中,而不是存储在Parent表中.
您可以通过加入为每个家长找到BestChild:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Run Code Online (Sandbox Code Playgroud)
此外,如果要为多个性能测试(针对不同类型的测试或不同日期的测试)存储最佳子项,则可以添加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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |