0

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

因此,这是数据库设计的部分内容:

标准条件:

  • 多间房屋
  • 每栋房屋多层
  • 每层有多个卧室

非标准条件:

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

因此,我想要完成的就是这个。在应用程序设计中,我知道house,我知道floor,我知道occupantbedroom我需要在没有用户指定的情况下使用这些信息找出occupant基于这 3 个标准的内容。有两种解决方案。首先是在occupants_has_bedrooms表中,我将主键设为occupants_id,bedrooms_floors_idbedrooms_floors_houses_id. 但是,当我bedrooms_id从主键中取出时,该表不再是与父级的识别关系(bedrooms)。这是一种识别关系,因为没有父母就无法存在。因此,有些事情告诉我我需要将所有四个 id 作为主键。我的第二个选项是这三个值之间的唯一索引,但是这是我认为我可能正在接近这个错误的时候。

我该如何做到这一点?

4

2 回答 2

1

这是一个通用的数据库设计策略,它并不特定于 MySQL,但应该仍然有用。

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

首先要明确的是每张桌子的PK是多少?floors看起来您正在为and使用复合键bedrooms。如果您对除交集表之外的所有表使用无信息键(每个表的 ID 列)策略Occupants_has_bedrooms,它会使您的连接更简单。我假设你可以,所以这是从那里开始的方法:

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

接下来,对 进行以下更改occupants_has_bedrooms

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

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

于 2012-09-01T06:43:28.633 回答
0

我会设计与你所做的相反的数据库。

House
  id
  name
  Floors -- Many to many

Floor
  id
  name
  Bedrooms -- Many to many
  optional: you can have a back pointer to house

Bedroom:
  id
  name
  Occupants -- many to many
  optional : back pointer to floor

Occupant:
  id
  name
  optional : back pointer to Bedroom

现在有了这个多对多表,您可以相当轻松地查询您的条件。

于 2012-09-01T05:53:15.417 回答