模式R =(A,B,C,D,E,F)
FD F = {ABC - > D,CD - > B,BCF - > D,CDF - > BE,BCDF - > ë}
查找Fc,F的最小封面(又名。规范封面)。
这是我书中使用的方法:
示例:abc - > XYZ
如果(bc)+⊇a,a是多余的(无关的);如果(abc)+⊇x
,则x是多余的注意:这里,闭包是使用F计算的,其中a或x从abc中删除 - > xyz分别。
我不明白最后一句粗话。
一个解决方案是:
考虑CDF - > BE
B 是多余的:(CDF)+ =(CDFBE)⊇( B )
F变为{ABC - > D,CD - > B,BCF - > D, CDF - > ë}
但我不明白。
根据这个逻辑:
E也可能是多余的,
怎么把:
考虑CDF - > BE
E 是多余的:(CDF)+ =(CDFBE)⊇( E )
F变为{ABC - > D,CD - > B,BCF - > D, CDF - >乙}
我知道我必须忽略一些重要的标准。谁能告诉我那是什么?
答案 0 :(得分:4)
如果r(R)是定义了函数依赖关系集F的关系模式,则R中的属性A与函数依赖关系x-> Y
无关if A belongs to X and A is extraneous then
(F - {X->Y}) U {(X-A) -> Y} is equivalent to F
if A belongs to Y and A is extraneous then
F is equivalent to (F - {X->Y}) U {X -> (Y-A)}
计算A是否与X无关
1. Find (X-A)+ under F
2. If Y is a subset of (X-A)+ under F then A is extraneous
我们的想法是检查我们是否可以在此函数依赖项的左侧获取已删除的属性,并且仍然可以使用F中的其他函数依赖项来派生它。如果是,那么A是多余的,因为它可以是从其他FD推断。
计算A是否与Y无关
1. Find F' = (F - {X->Y}) U {X -> (Y-A)}
2. Find X+ under F'
3。如果F'下的X +包含A,那么A与Y无关。
在这里,我们从左侧移除A,并检查是否可以从已从该移除A的FD集推断出移除的属性。一种模拟,如果我们有FD {X - > (Y-A)}和集合F中的其他FS,并在此模拟FD下找到X的闭包。如果我们看到X +包含原始集合中已删除的属性,那么它在原始集合中是多余的,因此我们将A声明为与Y无关,并将该集合保留为已移除的A,我们称之为F',因为F'具有与F相同的封闭。
请注意,我们不会使用已删除的A计算F',如秒的情况。这是因为(X-A)是X的子集,因此,F下的(X-A)+总是在属性闭包计算的某个步骤中产生(X-A)U Y.这与我们构造F'=(F - {X-> Y})U {(X-A) - >的相同。 Y}并计算此F'下的(XA)闭包,因为(XA)是其自身的子集,并且F'中的修改FD也将计算为(XA)U Y.这是A属于的原因X,我们不计算F'。虽然我们可以,但它在闭包计算方面没有区别。
另一方面,当A属于Y时,我们必须计算F',其中A从Y中移除,这是因为当我们在F'下找到X +时,我们在步骤中得到XU(YA),如果我们找到在F下关闭X我们得到XUY,这没有意义,因为它只是在原始集合下计算X的闭包,我们无法判断某些属性是否无关。
简单地说,检查是否可以从集合中的其他FD推断出已移除的属性。从原始集中删除目标FD,并检查是否可以从其他属性逻辑推断已删除的FD的已删除属性。阿姆斯特朗的公理也可以应用。
请注意,如果两个属性与左侧或右侧的FD无关,则无法删除这两个属性。在这种情况下,生成两个FD,每个FD都删除了一个无关属性。如在你的例子中
F = {ABC -> D, CD -> B, BCF -> D, CDF -> BE, BCDF -> E}
由于CDF->BE
,B
是无关紧要的,E
也是无关紧要的。所以这会产生两种可能性:
F1 = {ABC -> D, CD -> B, BCF -> D, CDF -> B, BCDF -> E}
F2 = {ABC -> D, CD -> B, BCF -> D, CDF -> E, BCDF -> E}
(此处您可以删除CDF-> E也作为BCDF-> E表示CDF-> E)
您可以找到一组功能依赖项的多个Canonical Cover / Minimal Cover。所以它不是唯一的。您不需要跟踪这样生成的所有可能性。只需选一个。
AS快速计算这里是我发现的经典封面/最小封面:
Fc = {AC->D, CD->B, CF->DE}
如果还有其他问题,请告诉我们。
<强> EDIT1:强>
考虑
r(A, B, C)
和FD的集合是
F = {A->BC, B->AC, C->AB}
您在F
下看到,B
与A->BC
无关。同样,“C”与A->BC
下的F
无关。但是你不能同时删除这两个,因为当你发现B
与A->BC
无关时,你已经删除了B
,结果是A->C
,你现在有了新的功能依赖集:F1 = {A->C, B->AC, C->AB}
其中C
与集合A->C
下的F1
无关。每个删除步骤都会为您提供一组新的FD,您可以在其中找到下一个选定的属性是否无关。
以上示例非常有趣,因为您可以从中获得4个规范封面,如下所示。
A->BC
B->AC
C->AB
|
+-----------------+-----------------+
| |
A->C A->B
B->AC B->AC
C->AB C->AB
| |
+--------+--------+ +--------+--------+
| | | |
A->C +---+---+ +---+---+ A->B
B->A | A->C | | A->B | B->AC
C->AB | B->C | | B->AC | C->A
| | C->AB | | C->B | |
+ +-------+ +-------+ +---+---+
| | Fc2 | | Fc3 | | A->B |
+---+---+ +-------+ +-------+ | B->C |
| A->C | | C->A |
| B->A | +-------+
| C->B | | Fc4 |
+-------+ +-------+
| Fc1 |
+-------+
注意树是如何形成的,通过不同的移除可能性,以及相对于它所在的最新FD的无关属性的计算。我的意思是你不能删除FD A->BC
,因为{{1和B
与F下的C
无关,因为删除A->BC
会生成另一个带有B
(一个分支)的FD并从A->C
中移除C
{1}}形成另一组FD A->BC
(另一个分支)。