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

标签 sql database database-design entity data-modeling

我有 3 个实体

  • worker
  • 学生
  • 地址

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

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

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

哪个选项最好,为什么?

提前致谢。

最佳答案

首先:建模技术不好:

Each address can be the address of x students and y workers

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

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

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

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

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

关于sql - 具有多个多对多关系的数据库建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48014989/

相关文章:

c# - System.Data.OleDb.OleDbException 需要一个或多个参数

c# - 如何在 Oracle DB 的 SQL 查询中传递 DateTime 参数

mysql - 为什么 ON CASCADE DELETE 不起作用?

PostgreSQL - 根据另一个单元格值设置默认单元格值

database - 更改数据的数据记录模式

sql-server - 历史、版本化和不可变数据

sql - 如何在 SQL 中的循环中进行循环,类似于 for-each 循环?

java - 创建用于搜索的数据库

mysql - phpMyAdmin SELECT FROM 主键问题

mysql - MySQL中特定数据库约束的解决方案