您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

我会回答这个问题,因为我觉得这是一个设计缺陷。

首先,如果两张表是真正的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)

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

通过这种方式,您可以强制执行所需的参照完整性(每个 BestChild 都是一个 Child,每个 Parent 只有一个 BestChild)并且 References 中没有循环路径。对最佳孩子的引用存储在额外的表中,而不是存储在Parent表中。

您可以通过以下方式为每位家长找到 BestChild:

Parent
  JOIN BestChild
    ON Parent.id = BestChild.parentid
  JOIN Child
    ON BestChild.childid = Child.id

此外,如果您想为多个性能测试(针对不同类型的测试或不同日期的测试)存储最佳子项,您可以添加一个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 2022/1/1 18:53:09 有385人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶