涉及多个表的一对一关系

时间:2017-08-28 08:23:45

标签: mysql sql database database-design one-to-one

说,

我有3张桌子。

User,其中包含有关用户的基本信息。

SectionA其中包含有关该用户的更多信息。

SectionB其中还包含有关用户的更多信息。

每个用户只能有一个SectionASectionB数据。

我的想法是创建一个像这样的表格设计:

id  name   section_a_id   section_b_id
1   matt   1               1

问题是,section_a_idsection_b_id无法自动递增,因为它们不是主键。

所以我尝试了另一种方法,并确定id中的User主键应该是引用section_a_id和section_b_id`的外键。但我无法这样做,因为mysql只允许引用一个表。

那我该如何应对这种情况呢?

4 个答案:

答案 0 :(得分:1)

好像你有:

  • 1-n User-SectionA关系
  • 1-n User-SectionB关系

所以外键必须在SectionA和SectionB表中,并且它们必须是User表主键。

答案 1 :(得分:1)

  

每个用户只能有一个SectionA和SectionB数据。

这就引出了为什么要将数据存储在不同的表中的问题。这有时是件好事 - 不同的用户可能在不同的表中。

一种解决方案是让SectionASectionB的主键成为UserId的外来引用。是的,这是允许的。

另一种解决方案是在sectionA_id表中使用sectionB_idusers。然后,您可以在每个引用的表中使用自动递增的ID。

答案 2 :(得分:1)

如果它是一对一的关系,将三个表组合成一个大表总是更容易,并且可以为Section表提供可为空的列。

我可以看到这种方法的一些积极观点:

  • 更轻松地插入,更新和删除操作。
  • 当使用较少的联接时,可以更快地检索数据。
  • 索引空间较少,因为您要为一个表而不是三个表索引主键。

答案 3 :(得分:0)

罕见用于1:1

  • 你真的有太多列;
  • 表格很大,您不希望更改表格以添加更多内容;
  • 其中一个表几乎是可选的,您使用webView.getSettings().setJavaScriptEnabled(true); 来获取空值。

纠正一些LEFT JOIN误解

  • 该列不一定是AUTO_INCREMENT,也不一定是PRIMARY KEY;它只需要是某个索引中的第一列。
  • 您根本不必拥有UNIQUE列。通常最好使用“自然”PK - 某些列(或列的组合)本身就是AUTO_INCREMENT

构建一对1:1表时,这是一种方式

  1. 使用UNIQUE构建第一个表PRIMARY KEY
  2. 使用AUTO_INCREMENT构建第二个表,该表与另一个表相同,但不是PRIMARY KEY
  3. 插入行时,请使用AUTO_INCREMENT获取ID。
  4. 使用该值显式指定第二个表的id。