我认为您的“乌鸦脚”图不支持您问题中概述的其他依赖项。您是如何提出 FILE 和 UNIT 之间的 1:Many 关系的?
这些是您描述的功能依赖项......
此外,我假设上述每个属性都在功能上确定了一些其他属性不会出现在任何其他功能依赖项的左侧。这些将是:
- 文件-> 其他文件属性
- 组-> 其他组属性
- 块-> 其他块属性
- 单位-> 其他单位属性
从上述函数依赖构造一组 3NF 关系给出:
- 文件关系:(文件,其他文件属性)
- GroupRelation: ( GROUP , FILE , other-group-attributes)
- UnitRelation: ( UNIT , other-unit-attributes)
- BlockRelation:(BLOCK,GROUP,UNIT,其他块属性)
这几乎与您所描述的相符。
确定哪些UNIT实例与给定FILE相关,
需要将 FileRelation 连接到FILE上的GroupRelation,然后将 GroupRelation 连接到GROUP上的 BlockRelation,然后将 BlockRelation 连接到UNIT上的 UnitRelation 。
您希望通过在模型中的某处插入一个新关系来避免这种多表连接,该关系提供从UNIT到FILE的直接映射。这种关系意味着函数依赖:
这看起来像您添加到“乌鸦脚”图中的位。添加这个引入了一个逻辑矛盾。原始模式支持具有与多个FILE实例相关的给定UNIT 。如:
- 文件关系(F1,...)
- 文件关系(F2,...)
- GroupRelation(G1, F1, ...)
- GroupRelation(G2, F2, ...)
- 块关系(B1,G1,U1,...)
- 块关系(B2,G2,U1,...)
- 单位关系(U1,...)
UNIT 实例 U1 与 FILE 实例 F1 和 F2 相关。在这种情况下,不能支持UNIT -> FILE功能依赖,或者原始的功能依赖集不完整并且模式不在 3NF 中。
此时你需要解决现实世界是否支持FILE -> UNIT
依赖。如果是这样,那么原始模型不在 3NF 中,并且需要对模式进行更多修改。如果不支持依赖项,那么您可以说的最好的方法是:
以及对应关系:
是一种反规范化,因为它的内容可能是通过现有表的功能依赖关系派生的。
==================================================== ================================
编辑
根据对此和其他答案的许多评论,看来:
是真正的函数依赖,函数依赖:
虽然不是不正确的,但一定是多余的。我相信这个模型现在正确的 3NF 关系集是:
- 文件关系:(文件,其他文件属性)
- GroupRelation: ( GROUP , FILE , other-group-attributes)
- UnitRelation: ( UNIT , FILE , other-unit-attributes)
- BlockRelation:(BLOCK,GROUP,其他块属性)
请注意,UNIT外键已从 BlockRelation 中删除。这是因为UNIT -> FILE FD 使它变得多余。( BLOCK , UNIT ) 关系现在是通过将 UnitRelation 连接到FILE上的 FileRelation,然后将 FileRelation 连接到FILE
上的 GroupRelation,然后将 GroupRelation 连接到GROUP上的 BlockRelation 来形成的。
由于未说明的功能依赖关系,原始模式不在 3NF 中:UNIT -> FILE。上面提出的一组关系在 3NF 中。
注意:在规范化模式时,需要预先说明每个功能依赖项。缺少一个可以改变整个画面!