Mysql 何时在SQL数据库中使用哪种类型的表关系
如何确定在整个数据库中对不同数据使用哪种类型的表关系?数据库何时足够大,可以保证一种方法优于另一种方法 用一个例子可以更好地解释这一点。假设您有一些要记录的汽车测试数据。您将获得诸如车型年和型号等信息 示例1-一个表格Mysql 何时在SQL数据库中使用哪种类型的表关系,mysql,sql,sql-server,database,sqlite,Mysql,Sql,Sql Server,Database,Sqlite,如何确定在整个数据库中对不同数据使用哪种类型的表关系?数据库何时足够大,可以保证一种方法优于另一种方法 用一个例子可以更好地解释这一点。假设您有一些要记录的汽车测试数据。您将获得诸如车型年和型号等信息 示例1-一个表格 entryID | modelYear | model 1 | 2011 | Fusion 2 | 2012 | Focus 3 | 2013 | Explorer 4 | 2011 | Fo
entryID | modelYear | model
1 | 2011 | Fusion
2 | 2012 | Focus
3 | 2013 | Explorer
4 | 2011 | Focus
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_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
如果我们想获得所有焦点条目,可以使用where model=“Focus”直接从此主表中提取数据
示例2-主表中有数字索引的两个表
entryID | modelYear | model
1 | 2011 | Fusion
2 | 2012 | Focus
3 | 2013 | Explorer
4 | 2011 | Focus
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_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中的model列进行查找,与model_lookup_表中的modelID进行比较,并将它们连接在一起
示例3-在model_查找表中保留条目索引的两个表
entryID | modelYear | model
1 | 2011 | Fusion
2 | 2012 | Focus
3 | 2013 | Explorer
4 | 2011 | Focus
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_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标准形式
- 与代理键相比,值需要相对较大的存储空间。注意,我并不建议所有查找表都使用代理键,自然键(例如年份号)是完全可以的
- 值的表示形式经常更改,例如经常更改的产品名称
您的示例1目前是完全有效的,但是在一个完整的数据库中,上面的一些因素可能变得很重要。根据上述标准,与modelYear相比,modelYear可能是一个更好的查找表候选对象,但请注意,如果需要,可以为这两种类型创建查找表。示例2对我来说似乎是正确的,不确定示例3显示了什么,这对我来说没有多大意义。使用model_lookup_table,您似乎试图创建一个链接表,所以model不应该在其中。对于示例3,您可能需要将
main
链接到model\u lookup
链接到model
,但我认为这不是必需的,因为您没有多对多关系。我认为我对示例3的解释很糟糕。。。。因此,假设您有两个2011车型年的车型条目(即2011 focus和2011 fusion)。使用示例2的样式,对于主表中总共4条记录,您必须有第二个条目(model_year as 2011)。对于示例3,您的主表将保留3条记录(2011、2012、2013),即使2011可能有两个模型与之关联;它可能试图表示一种多对多的关系,但没有考虑这种关系。更新了示例1-3,希望使示例3更清楚地说明我的目的。如果还不清楚,请告诉我。另一个例子是,如果您正在为这些车辆添加测试编号。如果2011 Focus有四个与之相关的测试编号呢。您可以使用示例3的样式将main中的单个条目与四个不同的测试编号相关联,而不是在主表中添加四个几乎相同的条目。