【问题标题】:In a SQL database, when should a one-to-one relationship be in the same table and when in separate tables?在 SQL 数据库中,一对一关系什么时候应该在同一个表中,什么时候应该在不同的表中?
【发布时间】:2017-06-30 05:20:13
【问题描述】:

谁能提供一些示例,说明在 SQL 数据库中,何时将一对一关系保留在同一张表上是更好的选择,而何时将它们放在单独的表上更有意义?

【问题讨论】:

  • 虽然您并不讨厌表中的所有空列都是单独表的 OUTER JOIN。
  • 没有真正的一般规则。这是个人感觉的问题。通常,我使用的经验法则(也不准确)是需要辅助列的频率。那些只是偶尔出现一次的应该放在一个单独的表中。那些总是存在的应该在同一张桌子上。在哪里划定“偶尔”和“经常”之间的界限只是个人喜好,正如@philipxy 所说,还取决于您愿意支持空值的程度。

标签: sql database foreign-keys relational-database


【解决方案1】:

当您有几个实体都必须能够充当另一个实体的外键,并且“几个实体”具有公共属性和唯一属性,并且您希望对唯一属性(或不太重要的不想要一堆 NULL 值用于不适用于其他实体的唯一属性)。即使您没有唯一/通用属性并且不关心 NULL 值,如果您希望在每个 subtpye 表和超类型表上都有单独的外部约束,您可能仍然希望这样做。这种策略称为超类型/子类型建模。

让我举个例子。

人民

  • id (PK)
  • 姓名
  • 年龄

老师

  • id(PK 和 people.id 的 FK)
  • years_teaching 不为空
  • 任何不为空的

学生

  • id(PK 和 people.id 的 FK)
  • 等级不为空
  • 任何不为空的

如您所见,教师和学生可以为某些属性使用一个公用表,并且每个人都可以拥有自己的 NOT NULL 唯一属性。此外,您可以将人员、教师和学生加入其他表并保持参照完整性。

另一个应用程序“可能”是,如果您为每条记录都有单独的数据库,其中一些属性在一个中,另一个在另一个中,但是,我从未这样做过。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2016-05-09
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多