我试图更好地理解规范化,以便我可以使用最佳实践。我在一本旧书中发现了一个问题,我对它有点困惑。基本上我给这个表提供了以下数据:
Name Sport Sport Centre
Jim Tennis A1
Jim Golf A2
Dan Tennis A1
Dan Golf A3
Ben Golf A2
所以我们假设每个运动中心只能举办一项运动。我想要的是将其转换为BCNF。我的过程(从我迄今为止所学到的)如下:
1 ,我在此确定了所有功能依赖项:
体育中心 - >体育
(姓名,体育中心) - >运动
2 ,我确定了所有候选键:
(姓名,体育中心)
但这是我被卡住的地方。我认为在BCNF中,表必须有超过1个候选键,我只能看到一个。我不确定如何把它送到BCNF。我所做的是以下分割表:
Name Sport Centre
Jim A1
Jim A2
Dan A1
Dan A3
Ben A2
Sport Centre Sport
A1 Tennis
A2 Golf
A3 Golf
但我也明白,要在3NF(在BCNF之前),每个属性必须依赖于完整的主键,但我的分裂打破了这个规则。
我如何在这里正确规范化?
答案 0 :(得分:2)
1,我在这里确定了所有的功能依赖:
您尚未确定所有持有的FD(功能依赖项)。第一:FD在属性集之间。虽然如果我们将自己限制在从一组属性到包含单个属性的集合的FD中,那么我们可以推断出其他FD所持有的东西。所以我们可以限制我们所说的所有",但你应该知道你在说什么。下一步:您已经确定了一些持有的FD。但是他们通过阿姆斯特朗的公理所暗示的所有这些也都成立了。这总是意味着一些琐碎的FD,例如{Sport Center} - >体育中心& {} - > {}。虽然我们可以通过了解属性来推断琐碎的FD。所以我们再次限制我们所说的所有",但你应该知道你在说什么。碰巧你已经在RHS上识别出具有一个属性的所有非平凡FD。但是你没有证明你找到的那些或者你找到了所有的那些。
你需要学习算法&用于生成所有持有FD的集合的描述的相关定义。包括阿姆斯特朗的公理,FD传递闭合的概念& FD规范封面的概念,以简洁地描述封闭。
2,我确定了所有候选键:
假设{{体育中心} - > Sport}是一个规范的封面,唯一的CK是{Name,Sport Center}。
你需要学习算法&查找所有CK的相关定义。
我认为在BCNF中该表必须有多个候选键
那是错的。你好像想要回忆起像" 3NF&不是BCNF意味着超过1个CK"或" 3NF& 1 CK意味着BCNF",这是真的。但是这些并不能说明BCNF意味着超过1个CK,或者相当于1个CK意味着不是BCNF。
你需要学习BCNF& amp;的定义。其他相关定义。
我不确定如何把它送到BCNF。
我们总是可以分解为BCNF设计。 BCNF的大多数定义都表明,当没有某种形式的FD时。碰巧我们可以通过反复无损地分解来消除问题FD到达BCNF。然而,这可能不必要地“保存”#34;函数依赖。因此,我们通常首先将保存分解为3NF / EKNF,这样可以始终保留FD。虽然然后去BCNF可能无法保留FD,即使直接从原始保留了FD保留分解。
你需要学习算法&分解为给定NF的相关定义。包括无损分解的概念& FD保存。
但我也明白,在3NF(在BCNF之前),每个属性必须依赖于完整的主键,而我的分裂打破了这个规则。
为了归一化到给定的NF,没有必要经历较低的NF。一般来说,这可以消除良好的最终NF设计。
另外"在3NF [...]中,每个属性必须依赖于完整的主键"是不正确的。你需要记住定义 - 必要和&充足的条件。而PKs(主键)与规范化无关,CK也可以。虽然我们可以调查一个CK的特殊情况,然后我们可以将其称为PK。另外"我的分裂打破了这个规则"没有意义。表格在某些NF中的必要条件不是关于如何分解到它或任何其他NF的规则。
你需要找一本(好的)学术教科书,并学习它的规范化定义。算法。 (几十本教科书都是免费在线的,也包括幻灯片和课程。)当你被困在它之后,参考&引用它,显示你的工作,然后解释你是如何陷入困境的。
答案 1 :(得分:-1)
我想我可能已回答了我自己的问题,但除非社区专家能够确认,否则我不会对此进行标记。
所以我的分裂是有效的,我错误地识别了候选键。
有两个候选键:
(姓名,体育中心)
(体育中心,运动)
如果这是正确的,那么我将表格拆分为BCNF并且有效。我认为这是正确的。