何时在SQL数据库中使用什么类型的表关系

时间:2017-01-10 16:55:43

标签: mysql sql sql-server database sqlite

如何确定整个数据库中用于不同数据的表关系类型?数据库何时足以保证一种方法优于另一种方法?

通过示例可以更好地解释这一点。假设您要记录一些汽车测试数据。您将获得模型年份和型号

等信息

示例1 - 一个表

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

如果我们想获得所有Focus条目,您可以使用where =“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 - 具有与另一列相关的多个值的列的正确关系数据库,并限制“主表”中的条目数

我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:0)

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

  • 可扩展(将在以后添加或删除值,尤其是用户时)。

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

  • 相关属性或关系(例如,模型可用作自动,手动或两者,具有区域翻译,或与制造商相关)。更正式地说,请参阅第二和第三种正常形式的数据库关系。

  • 与代理键相比,值需要相对较大的存储空间。注意我并不建议将代理键用于所有查找表,自然键(例如年份编号)完全没问题。

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

您的示例1完全有效,但在完整的数据库中,上述一些因素可能会变得非常重要。基于上述标准,模型可能是查找表的最佳候选者而不是modelYear,但请注意,如果需要,可以为两者创建查找表。