mysql - 关于识别关系和多对多关系的数据库设计问题

标签 mysql database many-to-many identifying-relationship

我有一个奇怪的数据库设计问题,我不确定我这样做是否正确。由于我当前的设计非常复杂,因此我在下图中将其简化,并使用房屋和居住者(不是我的实际实体)进行比较。

所以,这是数据库设计的一部分:

标准条件:

  • 多栋房屋
  • 每栋房子有多层
  • 每层设有多间卧室

不太标准的条件:

  • 每个居住者可以居住在多栋房屋中
  • 每个房屋的每个住户可以拥有多间卧室
  • 每个住户每栋房子每层楼只能拥有一间卧室(这是棘手的部分)例如,他们可以在 1 楼拥有一间卧室,在 2 楼拥有一间卧室,在 3 楼拥有一间卧室,但是切勿在同一楼层有两间卧室

因此,我想要完成的就是这个。在应用程序设计中,我知道房子,我知道地板并且我知道居住者。我需要在用户不指定的情况下通过这些信息找出居住者基于这3个标准的卧室。有两种解决方案。第一个是在 ocupants_has_bedrooms 表中,我将主键设为 ocupants_idbedrooms_floors_idbedrooms_floors_houses_id。但是,当我从主键中删除 bedrooms_id 时,该表不再是与父项 (bedrooms) 的标识关系。但这是一种识别关系,因为没有 parent ,它就不可能存在。因此,有件事告诉我,我需要将所有四个 id 保留为主键。我的第二个选择是这三个值之间的唯一索引,但是这是当我认为我可能正在接近这个错误时。

我该如何实现这个目标?

最佳答案

这是一个通用的数据库设计策略,并非特定于 MySQL,但仍然会有帮助。

知道如何查询数据是件好事,但不要让它过度影响您的模型(至少一开始是这样)。

首先要明确的是每 table 的PK是什么?看起来您正在使用地板卧室的复合键。如果您对除交集表 Occupants_has_bedrooms 之外的所有表使用无信息键(每个表的 ID 列)策略,它将使您的联接更加简单。我假设你可以,所以这里是如何开始:

我要更改的第一件事是删除卧室中的 Floors_house_id 列 - 这现在是多余的,可以从连接中获取。

接下来,对 ocupants_has_bedrooms 进行以下更改:

  1. 的 PK 只能是两列,ocupants_id 和 Bedroom_id。 (为什么?因为主键应该只包含足够的信息来唯一标识一行)。
  2. 移除 bedrooms_floors_houses_id,因为它由 bedrooms_floors_id 确定,并且不需要。
  3. 在 (ocupants_idbedrooms_floors_id) 上添加唯一约束,以强制执行“不那么标准”的条件。

最后,对除 Occupants 之外的所有表进行内部联接,在 WHERE 子句中添加三个条件。这应该会给你带来你想要的结果。如果你真的想要复合键,你仍然可以这样做,因为它会变得困惑。抱歉,我不在编辑附近,否则我会为您绘制图表。

关于mysql - 关于识别关系和多对多关系的数据库设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12225254/

相关文章:

php - 显示数据库中存储的图像

mysql - CarName如何存储一次并防止重复存储?

sql - 基于用户角色权限的数据库设计

MySQL,phpMyAdmin : TIMESTAMP Always Executes NOW Function

java - 尝试删除记录时如何修复 Spring-Boot 中的 "violates foreign key constraint"。使用@ManyToMany

php - 如何比较php中mysql查询的时间?

javascript - 如何通过变量将数据插入MySQL数据库?

c# - 在 Entity Framework 中表示联结表

php sql更新加入

mysql:如何更新多对多关系表