我有3个实体
每个工作人员可以拥有多个地址。每个学生可以有多个地址。每个地址可以是x学生和y工人的地址。
我的问题是,最好的数据建模是怎样的。只在一个关联表中实现多对多关系,如下所示:
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_I D和 Student_ID
哪个选项最好,也许为什么?
提前致谢。
答案 0 :(得分:3)
首先:这不是很好的建模技巧:
每个地址可以是x学生和y工人的地址
无需将Address
指定为两个或更多Students
或Workers
。如果他们有相同的Address
,您可以重复Address
。 请注意:有多少学生和工人拥有相同的地址?
在这种情况下:冗余优于Complexity 。
其次:您的第一种方法是错误的(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
)。
答案 1 :(得分:0)
我有一些问题。
为什么你决定制作一个地址表?
您系统中有多少次搜索基于地址字段?
您可以将Address用作字符串字段。在数据库设计中,我们在某些条件下将多字段字段更改为表。重要的条件是搜索领域是如此之多。
例如,在邮政系统或电话或地址查询系统中,而不是在常规系统中。