FD理论与正规形式

时间:2015-06-04 17:28:38

标签: sql database relational-database database-normalization functional-dependencies

如果我有新的

;WITH t AS (
SELECT 1 AS iteration, p.Permission_ID AS PermissionID, p.Permission_ID, CAST(N'/' + p.Permission AS NVARCHAR(MAX)) AS Permission
FROM #TempPermissions AS p
UNION ALL
SELECT iteration + 1, t.PermissionID, p.Parent_ID, COALESCE(N'/' + (SELECT s.Permission FROM #TempPermissions AS s WHERE s.Permission_ID = p.Parent_ID), N'') +  t.Permission
FROM t INNER JOIN #TempAppPermissions AS p ON t.Permission_ID = p.Permission_ID
)
SELECT PermissionID, Permission FROM t
WHERE Permission_ID = -1
ORDER BY PermissionID, Iteration

我知道它们不在BCNF或3NF中,因为候选键不在FD中。现在,如果功能依赖性如何,我如何将它们分解为BCNF。

  R1 = {A,B,C,D} and R3 = {C,D,E,H} 

1 个答案:

答案 0 :(得分:1)

要将关系R和一组功能依赖关系(FD's)转换为3NF,您可以使用 伯恩斯坦的综合 。申请伯恩斯坦的综合 - 左

  • 首先我们确保给定的一组FD's最小化
  • 第二次我们会将每个FD设为自己的子架构。
  • 第三次我们尝试合并这些子架构
在您的情况下

例如

R = {A,B,C,D,E,F,G,H,I}(根据您的上述评论
FD's = {A-> B,A-> C,E-> F,E-> G,AE-> H}左右

首先我们检查FD's是否为最小封面(单身右手边,没有无关的左侧属性,没有冗余的FD ) 。在这种情况下,给定的FD's已经是最小封面

第二我们使每个FD成为自己的子架构。所以现在我们有 - (每个关系的键都是粗体

[R <子> 1 = {的 A 下,B}
[R <子> 2 = {的 A ,C}
[R <子> 3 = {<强>电子
下,F}
[R <子> 4 = {<强>电子,G}
[R <子> 5 = {的 A,E 下,H}

第三我们看到是否可以组合任何子模式。我们看到 R 1 R 2 可以合并,因为它们具有相同的密钥。类似地, R 3 R 4 可以组合,因为它们具有相同的密钥。所以现在我们有 -

S 1 = { A ,B,C}
S 2 = { E ,F,G}
S 3 = { A,E ,H}左

这是 3NF 。现在检查 BCNF ,我们检查是否有任何这些关系(S 1 ,S 2 ,S 3 )违反 BCNF 的条件(每个功能依赖X->Y左侧(X必须是 超级键 )。在这种情况下,这些都不会违反 BCNF ,因此它也会被分解为 BCNF