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

标签 mysql database database-design insert relational-database

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

我的意思是,在 MySQL 5.5 和表 InnoDB 中,我有一个类似于以下的数据库设计 enter image description here

当我们尝试在表 1 和表 2 中插入行时,问题就出现了。由于MySQL中没有多表插入,我不能插入一行,因为外键在两个表中都是NOT NULL字段,应该同时插入到两个表中。

解决这个问题的最佳方法是什么?

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

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

  2. 如上所示,但有一个特殊值,如 -1。首先,在一个表中插入相当于 NULL 的 foreign key = -1 但避免将字段设置为 NULLABLE。之后,我们将行插入到另一个表中并更新插入的第一个。

  3. 在两者之间创建一个关系表,虽然这并不是真的有必要,因为它是 1 比 1 的比例

谢谢!!

编辑 我简要解释一下我需要这种循环关系:它是从父表到它的一个子表的非规范化。它是为了高性能而设计的,总是从父表中获得排名最好的 child 的引用。

最佳答案

我认为这是一个设计缺陷,所以我会回答这个问题。

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


其次,如果不是真正的1:1 关系而是父类(super class)型-子类型问题,您也不需要这个循环外键。假设 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)

在您描述的场景中,您有两个表 ParentChild 具有 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/

相关文章:

database - 制作字典数据库的最佳方法是什么

mysql 约束区间交集

mysql - 重复记录选择一次

mysql - 基于其他行的值的 SQL UPDATE 值

mysql - xsd :anyURI? 应该使用什么 MySQL 数据类型

javascript - 按名称从 firestore 获取文档

android - 对话框关闭时刷新 Activity

ruby-on-rails - 草稿记录是否应保存在单独的表格中?

mysql - 具有第三个时间维度的数据库结构

mysql - 我想获取具有多个条件的 ID 计数