Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 何时在SQL数据库中使用哪种类型的表关系_Mysql_Sql_Sql Server_Database_Sqlite - Fatal编程技术网

Mysql 何时在SQL数据库中使用哪种类型的表关系

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

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

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

示例1-一个表格

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中的单个条目与四个不同的测试编号相关联,而不是在主表中添加四个几乎相同的条目。