具有多个多对多关系的数据库建模

3

我有三个实体

  • 工人
  • 学生
  • 地址

每个工人可以有多个地址。每个学生也可以有多个地址。每个地址可能是x个学生和y个工人的地址。

我的问题是,最佳数据建模是什么样子的。将所有东西的多对多关系实现在一个联合表中:

ID | Address_ID | Worker_ID | Student_ID

ID为PK时,Worker_IDStudent_ID可以为空。

或者像下面这样分成2个表:

Address_ID | Worker_ID

PK是指主键,即地址ID工人ID

并且

Address_ID | Student_ID

PK 是 地址_ID学生_ID

哪个选项是最好的,可能为什么?

提前感谢。


似乎地址不是唯一适用于学生和工人的字段。我倾向于创建一个存储全局信息的“人员”实体,然后将与学生和工人的关系添加回到人员表中。这样做的额外好处是允许学生也成为工人。 - erik258
回应其他评论,你肯定想要一个“人员”或“成员”表,并有一个单独的表格(或列)来定义人员/成员与组织的关系。接下来的问题是,同一人员是否可以以多种身份相关联 - 例如,工人也可以是学生吗?他们的地址是与成员本身相关还是与他们的身份相关?例如,学生成员可能希望记录家庭和学期地址,而这种区别对于同一工作人员身份的成员可能是无意义的。 - Steve
丹·法雷尔所说的。学生或工人与人之间的关系是IS-A关系。学生和工人都可以通过person-id进行识别。查找类表继承以获取更多信息。 - Walter Mitty
2个回答

7
首先,这不是好的建模技巧:
每个地址可以是x个学生和y个工人的地址。没有必要将一个地址指定给两个或两个以上的学生或工人。如果他们有相同的地址,你可以重复使用该地址。请注意:有多少学生和工人拥有相同的地址?
在这种情况下,冗余比复杂性更好。
其次,你的第一种方法是错误的(ID | Address_ID | Worker_ID | Student_ID),会在数据库中造成空值陷阱。你的第二种方法更好。
第三,我提供第三种方法。你有工人和学生表。因此,这些表绝对有共同的属性。所以你可以创建另一个名为“Person”的表。然后将所有公共属性放入其中。然后你可以将“Person”与“Address”相关联(多对多或一对多)。
在这种情况下,“Worker”和“Person”之间存在继承关系(以及“Student”和“Person”之间)。为了将继承映射到关系模型中,你可以在“Worker”和“Person”之间使用一对一关系(以及“Student”和“Person”之间使用一对一关系)。在这些一对一关系中,最好将“Person_ID”转移到“Worker”(以及将“Person_ID”转移到“Student”)。

1
好的回答。更好的拆分地址的原因是,如果人们可能有多个地址。 - erik258

1

我有一些问题。

你为什么决定创建一个地址表?

你的系统中有多少搜索是基于地址字段的?

你可以将地址作为字符串字段使用。在数据库设计中,我们会在某些情况下将多字段字段转换为表格。重要条件是搜索字段太多。

例如,在邮政系统、电话或地址查找系统中,而不是常规系统中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接