如何确定整个数据库中用于不同数据的表关系类型?数据库何时足以保证一种方法优于另一种方法?
通过示例可以更好地解释这一点。假设您要记录一些汽车测试数据。您将获得模型年份和型号
等信息示例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 - 具有与另一列相关的多个值的列的正确关系数据库,并限制“主表”中的条目数
我是在正确的轨道上吗?
答案 0 :(得分:0)
如果域(例如有效的模型列表)满足以下任一条件,则查找表非常有用:
可扩展(将在以后添加或删除值,尤其是用户时)。
许多可能的值,使用行/列约束很难检查(例如ENUM或CHECK约束)。
相关属性或关系(例如,模型可用作自动,手动或两者,具有区域翻译,或与制造商相关)。更正式地说,请参阅第二和第三种正常形式的数据库关系。
与代理键相比,值需要相对较大的存储空间。注意我并不建议将代理键用于所有查找表,自然键(例如年份编号)完全没问题。
值的表示经常变化,例如经常更改的产品名称。
您的示例1完全有效,但在完整的数据库中,上述一些因素可能会变得非常重要。基于上述标准,模型可能是查找表的最佳候选者而不是modelYear,但请注意,如果需要,可以为两者创建查找表。