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

时间:2017-12-28 22:09:30

标签: sql database database-design entity data-modeling

我有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

哪个选项最好,也许为什么?

提前致谢。

2 个答案:

答案 0 :(得分:3)

首先:这不是很好的建模技巧:

  

每个地址可以是x学生和y工人的地址

无需将Address指定为两个或更多StudentsWorkers。如果他们有相同的Address,您可以重复Address请注意:有多少学生和工人拥有相同的地址?

在这种情况下冗余优于Complexity

其次:您的第一种方法是错误的(ID | Address_ID | Worker_ID | Student_ID)并在数据库中设置 Nullification 陷阱。你的第二种方法更好。

第三:我提供第三种方法。
您有WorkerStudent个表格。所以这些表绝对具有公共属性。所以你可以创建另一个名为它的表:Person。然后将所有常见属性放入其中。然后,您可以将PersonAddress(多对多或一对多)联系起来

在这种情况下,WorkerPerson(以及StudentPerson)之间存在继承。要将继承映射到关系模型,您可以在WorkerPerson(以及StudentPerson)之间使用一对一的关系。在这些一对一的关系中,最好将Person_ID转移到Worker(以及Person_ID转换为Student)。

答案 1 :(得分:0)

我有一些问题。

为什么你决定制作一个地址表?

您系统中有多少次搜索基于地址字段?

您可以将Address用作字符串字段。在数据库设计中,我们在某些条件下将多字段字段更改为表。重要的条件是搜索领域是如此之多。

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