我有3个实体
每个工作人员可以有多个地址。每个学生可以有多个地址。每个地址可以是x学生和y工人的地址。
我的问题是,最好的数据建模是怎样的。只在一个关联表中实现多对多关系,如下所示:
ID | Address_ID | Worker_ID | Student_ID
其中ID是PK,Worker_ID或Student_ID可以为null
或者像这样的2个表:
Address_ID | Worker_ID
PK是Address_ID和Worker_ID
和
Address_ID | Student_ID
PK是Address_ID和Student_ID
哪个选项最好,也许为什么?
提前致谢。
首先:它不是很好的建模技术:
每个地址可以是x学生和y工人的地址
没有必要将Address
指定为两个或更多Students
或Workers
。如果他们有相同的Address
你可以重复Address
。请注意:有多少学生和工人拥有相同的地址?
在这种情况下:冗余比复杂性更好。
其次:你的第一种方法是错误的(ID | Address_ID | Worker_ID | Student_ID
)并在数据库中制作一个Nullification陷阱。你的第二种方法更好。
第三:我提供第三种方法。
你有Worker
和Student
表。所以这些表绝对具有共同属性。所以你可以创建另一个名为它的表:Person
。然后将所有常见属性放入其中。然后你可以将Person
与Address
(多对多或一对多)联系起来
在这种情况下,Worker
和Person
(以及Student
和Person
)之间存在继承。要将继承映射到关系模型,可以使用Worker
和Person
(以及Student
和Person
)之间的一对一关系。在这些一对一的关系中,最好将Person_ID
转移到Worker
(和Person_ID
转移到Student
)。
我有一些问题。
为什么你决定制作一个地址表?
您系统中有多少次搜索基于地址字段?
您可以使用Address作为String字段。在数据库设计中,我们在某些条件下将多字段字段更改为表。重要的条件是搜索领域是如此之多。
例如,在邮政系统或电话或地址查找系统中,而不是在常规系统中。