【问题标题】:database modeling with multiple many-to-many relations具有多个多对多关系的数据库建模
【发布时间】:2018-06-09 10:40:52
【问题描述】:

我有 3 个实体

  • 工人
  • 学生
  • 地址

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

我的问题是,最好的数据建模是什么样的。只在一个关联表中实现多对多关系,如下所示:

ID | Address_ID | Worker_ID | Student_ID

其中 ID 是 PK 并且 Worker_IDStudent_ID 可以为空

或 2 个这样的表:

Address_ID | Worker_ID

PK 是 Address_IDWorker_ID

Address_ID | Student_ID

PK 是 Address_ID 和 Student_ID

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

提前致谢。

【问题讨论】:

  • 似乎地址不是唯一适用于学生和工人的字段。我很想创建一个存储全局信息的“人员”实体,然后将与学生和工人的关系添加回人员表。这还有一个额外的好处,就是让学生也可以成为工人。
  • 呼应其他 cmets,您肯定希望有一个“人员”或“成员”表,并有一个单独的表(或列)来定义人员/成员与组织相关的能力.下一个问题是,同一个人能否以一种以上的身份联系——例如,工人也可以是学生吗?他们的地址与会员本身有关,还是与他们的能力有关?例如,学生成员可能希望记录家庭地址和学期地址,而这种区别对于工作人员身份的同一成员可能毫无意义。
  • 丹·法瑞尔所说的。学生或工人与人之间的关系是 IS-A 关系。学生和工人都可以通过 person-id 来识别。查看类表继承了解更多信息。

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


【解决方案1】:

首先:这不是好的建模技术:

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

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

在这种情况下冗余优于复杂性

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

第三种:我提供第三种方法。
您有 WorkerStudent 表。所以这些表绝对有共同的属性。因此,您可以创建另一个名为它的表:Person。然后把所有常见的属性都放进去。然后你可以将PersonAddress 关联起来(多对多或一对多)

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

【讨论】:

  • 好答案。打破地址的更好理由是,如果人们可能有多个地址。
【解决方案2】:

我有一些问题。

您为什么决定制作地址表?

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

您可以将地址用作字符串字段。在数据库设计中,我们在某些情况下将多字段字段更改为表。重要的条件是搜索的领域太多了。

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

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多