Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中实现双重关系(Null,非Null),而不创建两个类?_Mysql_Sql_Database Design_Foreign Keys_Entity Relationship - Fatal编程技术网

如何在MySQL中实现双重关系(Null,非Null),而不创建两个类?

如何在MySQL中实现双重关系(Null,非Null),而不创建两个类?,mysql,sql,database-design,foreign-keys,entity-relationship,Mysql,Sql,Database Design,Foreign Keys,Entity Relationship,如果我有一个表,它由一个类型的属性列表和另一个同样由相同类型的列表组成的表组成,那么我如何将它们实现到MySQL中,而不必创建两个相同类型的表呢 例如: 与EMPLOYEE表一样,COMPANY表也有一个地址列表 我希望实现,而不必为公司和员工分别创建一个表地址,如本例所示: 在我看来,解决方案似乎是一种双重关系,其中一个外键必须为null,而另一个可能不为null,但我甚至不知道如何做到这一点。我相信你的基本Hyptosis是有缺陷的:一家由员工创建的一人公司可以在创始人的个人地址注册。因此,

如果我有一个表,它由一个类型的属性列表和另一个同样由相同类型的列表组成的表组成,那么我如何将它们实现到MySQL中,而不必创建两个相同类型的表呢

例如:

与EMPLOYEE表一样,COMPANY表也有一个地址列表

我希望实现,而不必为公司和员工分别创建一个表地址,如本例所示:


在我看来,解决方案似乎是一种双重关系,其中一个外键必须为null,而另一个可能不为null,但我甚至不知道如何做到这一点。

我相信你的基本Hyptosis是有缺陷的:一家由员工创建的一人公司可以在创始人的个人地址注册。因此,员工的地址可能与公司地址相同

同样,两名员工可能共享同一地址,丈夫和妻子可能是同事。因此,我将ADRES和其他两个实体之间的关系定义为一个规则的多对多,没有任何进一步的条件

你可能担心更改公司地址会错误地更改雇员的地址。但不要更新地址实体,而是将此案例视为创建新地址并将eg.公司链接到此新地址

现在,如果你真的需要实施约束,那就不管了哦,好无聊;事实上,除了实施一种形式的

请注意:

您最初的设计实际上实现了单表继承模式 您基于两个独立地址表的备选方案实际上实现了具体的表继承模式1 在初始设计中,可以使用地址表上的简单检查constraint2来实现约束,条件是company_id为NULL或employee_id为NULL

1迁移到类表继承模式只是一个练习。然而,这种模式无助于强制执行这种约束事实上,这种优雅的模式在强制执行完整性约束方面具有严重的额外限制。尽管如此,仍然可以使用检查约束来强制执行该约束


2 MySQL不强制执行检查约束,但是。

当您需要为多个员工/公司使用同一地址时会发生什么情况?