我有 3 个实体
- worker
- 学生
- 地址
每个 worker 可以有多个地址。每个学生可以有多个地址。每个地址可以是x个学生和y个 worker 的地址。
我的问题是,最好的数据建模是什么样的。仅在一个关联表中为所有内容实现多对多关系,如下所示:
ID | Address_ID | Worker_ID | Student_ID
其中ID为PK,Worker_ID或Student_ID可以为空
或像这样的 2 个表:
Address_ID | Worker_ID
PK 是Address_ID 和Worker_ID
和
Address_ID | Student_ID
PK 是Address_ID 和Student_ID
哪个选项最好,为什么?
提前致谢。
最佳答案
首先:建模技术不好:
Each address can be the address of x students and y workers
无需为两个或多个Students
或Workers
指定Address
。如果它们有相同的 Address
,您可以重复 Address
。 注意:有多少学生和 worker 有相同的地址?
在这种情况下:冗余优于复杂性。
其次:您的第一种方法是错误的(ID | Address_ID | Worker_ID | Student_ID
)并在数据库中制造了一个Nullification 陷阱。你的第二种方法更好。
第三种:我提供第三种方法。
您有 Worker
和 Student
表。所以这些表绝对具有共同属性。因此,您可以创建另一个表并将其命名为:Person
。然后将所有公共(public)属性放入其中。然后你可以将 Person
与 Address
联系起来(多对多或一对多)
在这种情况下,Worker
和Person
(以及Student
和Person
)之间存在继承关系。要将继承映射到关系模型,您可以在Worker
和Person
(以及Student
和 Person
)。在这些一对一关系中,最好将 Person_ID
转移到 Worker
(并将 Person_ID
转移到 Student
) .
关于sql - 具有多个多对多关系的数据库建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48014989/