gpt4 book ai didi

mysql - 如何在不创建两个类的情况下在 MySQL 中实现双重关系(Null,Not Null)?

转载 作者:行者123 更新时间:2023-11-30 23:02:53 25 4
gpt4 key购买 nike

如果我有一个 TABLE,它由一个 TYPE 的属性的 LIST 和另一个 TABLE 组成也是由 LIST 的相同 TYPE 组成的,所以我怎样才能将它们实现到 MySQL 而不必创建两个相同的 TABLES>类型?

例如:

Class Diagram

EMPLOYEE 表一样,COMPANY 表有一个ADDRESSES 列表。

而且我想实现而不必为 COMPANY 制作一个表 ADDRESS 和为 EMPLOYEE 制作另一个表,如本例所示:

Class Diagram

对我来说,解决方案似乎是一种双重关系,其中一个外键必须为 null 而另一个可能不是,但我什至不知道该怎么做。

最佳答案

我相信您的基本假设是有缺陷的:一个由雇员 创立的单人公司,可以在创始人的个人地址注册。因此,Employee 可能与 Company 具有相同的地址。

同样,两个 Employees 可能共享同一个地址(丈夫和妻子可能是同事)。因此,我会将 address 和其他两个实体中的每一个之间的关系定义为常规多对多,没有任何进一步的条件。

您可能担心更改(例如)Company 的地址会错误地更改Employee 的地址。但是不是更新 Address 实体,而是将这种情况视为创建一个新的 Address 并将(例如)Company 链接到这个新的 地址

现在,如果您真的需要实现约束,不管(哦,太沉闷了;)现实如何,除了实现 inheritance as decribed here 的形式外,我别无选择。 .

注意:

  • 您的初始设计实际上实现了单表继承模式
  • 您的备选方案(基于两个单独的 address 表)实际上实现了具体表继承模式1

在您的初始设计中,可以通过address 表上的简单CHECK 约束2 来实现约束,条件为company_id IS NULL XOR employee_id IS NULL


1 迁移到类表继承 模式是“留作练习”。但是,此模式无助于强制执行此约束(事实上,此优雅的模式在执行一般完整性约束方面具有严重的附加限制)。尽管如此,仍然可以使用 CHECK 约束来强制执行约束。

2 MySQL 不强制执行CHECK 约束,但是a similar effect can be achieved through the use of triggers .

关于mysql - 如何在不创建两个类的情况下在 MySQL 中实现双重关系(Null,Not Null)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23209465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com