【问题标题】:When to use what type of table relations in SQL databases什么时候在 SQL 数据库中使用什么类型的表关系
【发布时间】:2017-05-25 06:09:02
【问题描述】:

您如何确定对整个数据库中的不同数据使用哪种类型的表关系?什么时候数据库大到足以保证一种方法优于另一种方法?

这可以通过一个例子更好地解释。假设您有一些要记录的汽车测试数据。您将获得型号年份和型号等信息

示例 1 - 一张桌子

entryID | modelYear | model
   1    |   2011    | Fusion
   2    |   2012    | Focus
   3    |   2013    | Explorer
   4    |   2011    | Focus

如果我们想获取所有 Focus 条目,您可以使用 where model="Focus" 直接从该主表中提取数据

示例 2 - 在主表中有数字索引的两个表

main_table
entryID | modelYear | model
   1    |   2011    |   1
   2    |   2012    |   2
   3    |   2013    |   3
   4    |   2011    |   2

model_lookup_table
modelID | model
   1    | Fusion
   2    | Focus
   3    | Explorer

在这种情况下,您必须根据 main 中的 model 列进行查找,与 model_lookup_table 中的 modelID 进行比较并将它们连接在一起。

示例 3 - 在 model_lookup 表中保存条目索引的两个表

main_table
entryID | modelYear
   1    |   2011    
   2    |   2012    
   3    |   2013    

model_lookup_table
modelID | entryID | model
   1    |    1    | Fusion
   2    |    2    | Focus
   3    |    3    | Explorer
   4    |    1    | Focus

在这种情况下,您将比较 main_table.entryID 和 model_lookup_table.entryID 以提取最终表。请注意,主表条目的数量保持为 3 而不是 4。


我的想法:

示例 1 - 快速而肮脏,但适用于小型数据库

示例 2 - 具有单个条目的列的正确关系数据库

示例 3 - 具有与另一列相关的多个值的列的正确关系数据库并限制“主表”中的条目数

我走对了吗?

【问题讨论】:

  • 示例 2 对我来说似乎是正确的,不确定您在示例 3 中展示的内容,这对我来说没有多大意义。使用 model_lookup_table 您似乎正在尝试创建一个链接表,因此模型不应该在那里。对于示例 3,您可以将 main 链接到 model_lookup 链接到 model,但我认为这不是必需的,因为您没有多对多的关系。
  • 我认为我对示例 3 的解释很差......所以假设您有两个模型条目,其中 model_year 为 2011 年(即 2011 年的焦点和 2011 年的融合)。使用示例 2 的样式,您必须有第二个条目,其中 model_year 为 2011,主表中总共有 4 条记录。对于示例 3,您的主表将保留 3 条记录(2011、2012、2013),即使 2011 可能有两个与之关联的模型。
  • 是的,第三个例子意义不大;它似乎可能试图表示没有考虑这种关系的多对多关系。
  • 更新了示例 1-3,希望使示例 3 更清楚地说明我所追求的。如果还不清楚,请告诉我。
  • 另一个例子是,如果您要向这些车辆添加测试编号。如果 2011 Focus 有四个与之相关的测试编号会怎样。您可以使用示例 3 的样式将 main 中的单个条目与四个不同的测试编号相关联,而不是在主表中添加四个几乎相同的条目。

标签: mysql sql sql-server database sqlite


【解决方案1】:

如果域(例如有效的模型列表)满足以下任何条件,则查找表很有用:

  • 可扩展(因为将来会添加或删除值,尤其是用户)。

  • 许多可能的值,难以使用行/列约束(例如 ENUM 或 CHECK 约束)进行检查。

  • 相关属性或关系(例如,模型可作为自动、手动或两者兼有,具有区域翻译,或与制造商相关)。更正式地,请参见数据库关系的第 2 和第 3 范式。

  • 与代理键相比,值需要相对较大的存储空间。请注意,我不建议将代理键用于所有查找表,自然键(例如年份数)就可以了。

  • 值的表示经常变化,例如经常更改的产品名称。

您的示例 1 完全有效,但在完整的数据库中,上述某些因素可能变得很重要。根据上述标准,模型可能比 modelYear 更适合查找表,但请注意,如果需要,可以为两者制作查找表。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2017-06-30
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多