MySQL数据库设计.在1to1表中插入行.

Emi*_*lás 3 mysql database database-design insert relational-database

将行插入到彼此引用为1对1的表中的最佳方法是什么?

我的意思是,在MySQL 5.5和表InnoDB中,我有一个类似于以下的数据库设计 在此输入图像描述

当我们尝试在table1和table2中插入行时出现问题.由于MySQL中没有多表插入,因此我不能插入一行,因为两个表中的外键都是NOT NULL字段,并且应该同时插入两个表中.

哪个是解决这个问题的方法?

我想到了3个可能的解决方案,但我想知道是否有更多这些或哪个是最好的以及为什么.

  1. 将外键字段设置为NULLABLE,并在表中插入一行后插入另一行,然后更新de first.

  2. 正如上面所指出的那样但是有一个像-1这样的特殊值.首先,在一个表中插入一个key = -1等于NULL的外表,但避免将该字段设置为NULLABLE.然后,我们在另一个表中插入行并更新插入的第一行.

  3. 在两者之间创建关系表,虽然它不是必需的,因为它是1比1的比率

谢谢!!

编辑 我简要解释一下我需要这个循环关系:它是从父表到其子节点之间的非规范化.按照高性能的顺序,它始终是父表中排名最高的子项的引用.

ype*_*eᵀᴹ 7

我会做出这个答案,因为我觉得这是一个设计缺陷.

首先,如果这两个表是真正的1:1关系,为什么你不只有一个表?


其次,如果它不是真正的1:1关系而是超类型 - 子类型问题,那么您也不需要这个循环外键.可以说,table1Employeetable2Customer.当然,大多数客户不是员工(反之亦然).但有时客户也可能是员工.这可以通过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并且Child1: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)

  • @Emilio:也选中此选项.没有涉及触发器,没有循环引用和额外的表被规范化.(好的,如果你希望每次孩子的属性发生变化时都要更新最好的高效孩子,你可能会有触发器). (2认同)