我在数据库设计中学习了功能依赖的概念,我得出了以下让我困惑的例子。
1. {State, Driver_Licence_Number} -> SSN
2. Phone# -> Address and Address -> ZipCode, then Phone# -> ZipCode
我所学到的是X -> Y
表示X 功能性dertermins Y或换句话说Y在X上功能依赖。
但我发现上面的例子与这种辩护相矛盾。例如State和Driver_Licence_Number如何确定SSN?或者我的电话号码取决于我住的地方(县代码,地区代码),所以shuldn是地址 - >电话#? (或ZipCode - > Phone#)。
我错过了什么?
答案 0 :(得分:0)
您需要以两种不同的方式查看功能依赖性,具体取决于您是构建新数据库还是分析已构建的数据库。
对于新数据库,您可以发现主题中的功能依赖关系,然后使用它们来指导数据库设计,特别是关于表组合和数据规范化。
对于现有数据库,您尝试发现可能指导设计者的功能依赖性。您可以使用现有数据,但这可能会产生误导。您也可以使用数据库约束,应用程序代码或数据文档(如数据字典)(如果有)。
转到州和驾驶执照号码的情况,这是我看待主题的方式。在现实世界中,州和驾驶执照号码决定一个人。一个人只有一个SSN。因此,州加驾驶执照号码确定SSN。
这假设事情没有搞砸,社会保障管理局没有错误地将一个以上的SSN分配给一个人。此外,机动车部门没有搞砸,并在向一个人发放执照的过程中接受了欺诈性的SSN。
另一个看同一主题的人可能会看到不同的东西。
如果您接受上述内容,并且找到包含State,LicenseNo和SSN作为列的表,但State和LicenseNo不是候选键,则该表不在BCNF中。希望这会有所帮助。
答案 1 :(得分:0)
我所学到的是X - > Y表示X在功能上确定Y,或者换言之,Y在功能上依赖于X.
这不是功能依赖的定义,它是" - >"的定义。
功能决定具有精确的技术含义:
我们说一组列S在功能上确定了表中的另一个集合T,当第一个的每个子行总是出现时,第二个的子行相同。我们写S - > T并且假设S是行列式集合而T是确定的集合。我们称之为S - >功能依赖(FD)。当S是T的超集时,我们说它是一个微不足道的FD。当A是T中的一列时,我们说S在功能上决定了A.
功能依赖不是关于"如何"事情已确定"在世界上,但关于什么价值观可以在特定的表格中出现。这是由于情况和应该出现的情况,您应该在表中放置哪些行的结果。 (每个表都有一个DBA给定的参数化语句,称为谓词。谓词的参数是表的列。表保存从谓词中生成真实语句的行。)反过来当然受事物的影响和决定"在世界上。
1. {State, Driver_Licence_Number} -> SSN
这表示表格中的每个特定State
- Driver_Licence_Number
子元素值都显示为具有相同的特定SSN
值。如果这些表格列具有明显的含义,那么这可能是因为州和驾驶员的许可证号码识别特定的人,并且每个人都有一个SSN。或者也许是因为人们不总是拥有SSN或只有一个SSN,但是州,驾驶执照号码和SSN是特定公司的员工,而且一个人必须给他们一个SSN才能在那里工作。注意FD是否保持取决于表的谓词以及将该谓词应用于可能出现的情况可能产生的表值。
2. Phone# -> Address and Address -> ZipCode, then Phone# -> ZipCode
第一个FD表示特定Phone#
始终在此特定表格中显示相同的Address
。也许是因为这个表包含了使谓词" ...和电话号码电话号码的行在地址地址 AND ..."真正。也许该表是电话号码的反向目录,给出了分配给它的一名员工的主要地址。
但给出前两个FD持有,第三个必须保持。如果每个Address
只有Phone#
个ZipCode
,Address
只有ZipCode
,那么每Phone#
只能有一个#pragma omp parallel default(shared)
{
int tID = omp_get_thread_num();
int i, iCF, iPF, iNF, iPJG, iCJG, iNJG, iPRJG, iCRJG;
##pragma omp for nowait
for(i=0, iCF=0, iPF=0, iNF=sqrBcksDim, iPJG=0, iCJG=0, iNJG=sqrBcksSize, iPRJG=0, iCRJG=0 ; iCF<RHSArraySize ; iPF=iCF, iCF=iNF, iNF+=sqrBcksDim, iPJG=iCJG, iCJG=iNJG, iNJG+=sqrBcksSize, iPRJG=iCRJG, iCRJG+=rectBcksSize, ++i)
{
}
}
。有一些称为阿姆斯特朗公理的规则允许我们推导出由于给定持有而持有的所有FD。