【问题标题】:Is it still normalized db schema? database它仍然是标准化的数据库模式吗?数据库
【发布时间】:2011-04-15 21:32:48
【问题描述】:

我有以下 db-schema 。

FILEGROUPBLOCK代表XML文件的对象结构。 FILE 是根。 GROUPFILE 有 FK。 BLOCK 有一个 FK 到 GROUP,另一个 FK 到 UNIT

UNITFILE 的上下文中对来自不同 GROUPs 的“相似”BLOCKs 进行分组。

数据库目前在 3NF 中。但我想知道哪些 UNITs 属于 FILE.id=1。为此,我必须进行一个连接所有 4 个表的查询。为了优化这个模式,我可以创建新的关系 UNIT n--FK-->1 FILE。然而,我的查询仅在优化的 db-schema 上连接了两个表。 问题来了:这个 DB(带有这个新 FK)还在 3 NF 中吗?理论怎么说?

BLOCK  n--FK-->1  GROUP  n--FK-->1  FILE
 n 
 |
 FK    
 |    
 1  
Unit

            +--------+
      +-----|  File  |.....+
      |     +--------+     .
      |                    .
     /|\                  /.\
 +--------+           +--------+
 | Group  |--+     +--|  Unit  |
 +--------+  |     |  +--------+
             |     |
            /|\   /|\
           +---------+
           |  Block  |
           +---------+

【问题讨论】:

  • 你能尝试显示你的表结构而不是解释它吗?很难理解一组表格的解释。
  • @user229570,GROUP和UNIT是什么关系?目前,它们之间似乎存在多对多关系——将 FILE.ID 外键添加到 UNIT 会产生两个从 FILE 到 BLOCK 的并行层次关系。 3NF 不禁止这种并行关系,但通常会解析为一个层次关系,因为其中一个中间表通常与另一个中间表处于层次关系 - 当然,除非存在 true 它们之间的多对多关系。
  • 感谢您的编辑。我想这样做,但我的等级太低了。 UNIT 表示第二个并行层次结构。我会在我的等级足够的时候添加数据的探测。可能我们甚至必须添加这个新关系(UNIT -> FILE),因为它是并行层次结构。所以这是真正的“多对多”。 UNIT的业务意义在于它在文件的上下文中对具有相同处理条件的BLOCK进行分组。所以一个 UNIT 可以有两个 BLOCK 来自不同的 GROUP,但来自同一个文件。
  • 这里是数据样本。 pokazywarka.pl/px6786-2

标签: database rdbms normalization 3nf


【解决方案1】:

在您进行更改之前,尚不清楚 UNIT 表如何适应架构。

显然,在您进行更改后,您只需加入 FILE 和 UNIT 表即可知道哪些单元属于文件。

由于表处于 3NF 中,当所有功能依赖关系都由键、整个键以及只有键确定时(所以请帮帮我 Codd),因此您必须从这个角度看待您的架构。

鉴于可用信息,很可能这些表格都属于 3NF(以及 BCNF,以及 4NF 和 5NF 中的 AFAICT)。

【讨论】:

  • 所以帮帮我 Codd,我认为你没有仔细阅读这个问题。
  • -1 Jon:而且,看来你不知道标准化是什么意思。
【解决方案2】:

我认为您的“乌鸦脚”图不支持 您的问题中概述的其他依赖项。你是怎么上来的 与1:FILE和UNIT之间有很多关系吗?

这些是您描述的功能依赖项...

  • -> 文件
  • ->
  • -> 单位

另外,我假设上述每个属性在功能上决定了一些 附加属性未出现 在任何其他功能依赖项的左侧。这些将是:

  • 文件 -> 其他文件属性
  • GROUP -> 其他组属性
  • -> 其他块属性
  • 单位 -> 其他单位属性

从上述函数依赖构造一组 3NF 关系给出:

  • 文件关系:(文件,其他文件属性)
  • GroupRelation:(GROUPFILE、其他组属性)
  • UnitRelation:(UNIT,其他单位属性)
  • BlockRelation:(BLOCKGROUPUNIT、其他块属性)

这和你描述的差不多。

确定与给定 FILE 相关的 UNIT 实例 需要在 FILE 上将 FileRelation 连接到 GroupRelation,然后将 GroupRelation 连接到 GROUP 上的 BlockRelation,然后 UNIT 上的 BlockRelation 到 UnitRelation。

您希望通过在模型中的某处插入新关系来避免这种多表连接 给出从 UNITFILE 的直接映射。这种关系意味着泛函 依赖:

  • 单位 -> 文件

这看起来像您添加到“乌鸦脚”图中的位。添加这个引入了一个逻辑 矛盾。原始模式支持将给定的 UNIT 与 多个 FILE 实例。如:

  • 文件关系(F1,...)
  • 文件关系(F2, ...)
  • GroupRelation(G1, F1, ...)
  • GroupRelation(G2, F2, ...)
  • BlockRelation(B1, G1, U1, ...)
  • BlockRelation(B2, G2, U1, ...)
  • UnitRelation(U1, ...)

UNIT 实例 U1 与 FILE 实例 F1 和 F2 相关。鉴于这种情况,无法支持 UNIT -> FILE 功能依赖 或者原始的功能依赖集不完整,架构不完整 在 3NF 中。

此时需要判断现实世界是否支持FILE -> UNIT 依赖与否。如果是这样,那么原始模型不在 3NF 中,而且更多 模式的返工是有序的。如果不支持依赖项,那么最好的说法是:

  • 文件单位 -> 什么都没有

及对应关系:

  • FileUnit:(FILEUNIT

是一种反规范化,因为它的内容可能是通过现有的表功能依赖导出的。

============================================== ======================================

编辑

根据对这个和其他答案做出的许多 cmets,看来:

  • 单位 -> 文件

是真正的函数依赖,函数依赖:

  • -> 单位

虽然不正确,但一定是多余的。我相信正确的 3NF 集 现在这个模型的关系是:

  • 文件关系:(文件,其他文件属性)
  • GroupRelation:(GROUPFILE、其他组属性)
  • UnitRelation: (UNIT, FILE, other-unit-attributes)
  • BlockRelation:(BLOCKGROUP、其他块属性)

注意 UNIT 外键已从 BlockRelation 中删除。 这是因为 UNIT -> FILE FD 使它变得多余。这 (BLOCK, UNIT) 关系现在通过在 FILE 上将 UnitRelation 连接到 FileRelation 来形成 然后 FileRelation 到 FILE 上的 GroupRelation,然后 GroupRelation 到 GROUP 上的 BlockRelation。

由于未说明,原始架构不在 3NF 中 功能依赖:UNIT -> FILE。上面提出的一组关系是 在 3NF 中。

注意:在规范化模式时,需要说明每个功能依赖关系 在前面。缺少一个可以改变整个画面!

【讨论】:

  • 我添加了“crows-foot”图作为编辑 - FILE 和 UNIT 之间的附加关系(添加为虚线)来自原始问题的句子,“为了优化这个架构,我可以创建新的关系 UNIT n--FK-->1 FILE"。
  • @Mark Ba​​nnister:乌鸦足图对应于 OP 询问的“优化”模式,因此它对我的回答没有实质性的影响。
  • @Mark Ba​​nnister:我根据 UNIT -> FILE 是真正的功能依赖的确定更新了我的答案。
  • 通过删除块 -> 单元依赖作为冗余,您现在声明对于文件,属于该文件的所有块(即属于属于该文件的组的所有块)与属于该文件的所有单元相关联。但是,从 OP 的样本数据来看,情况并非如此 - Block 1 和 2 仅与 Unit 1 相关联,而 Block 3 仅与 Unit 2 相关联。因此,Block -> Unit 依赖关系不是多余的,并且 OP 提出了架构已正确规范化。
【解决方案3】:

从提供的信息看来,这是一个真正的并行层次结构。在此基础上,我相信提议的修正模式仍然会被规范化为 3NF。

【讨论】:

  • 原始模型包含 FD,因此 FILE 和 UNIT 之间存在多对多关系(通过 BLOCK 连接)。修改后的模型显示了 FILE 和 UNIT 之间的 1:many 关系。这是一个矛盾——出了点问题。假设 FILE/UNIT 关系是多:多。此信息已包含在模型中,除非存在一些完全依赖于特定 FILE/UNIT 实例的属性集。如果不是这种情况,则新模型包含冗余关系,不再是 3NF。
  • @NealB,现有关系暗示但不强制 FILE 和 UNIT 之间存在多对多关系。文件 ID 外键的添加将此关系解析为 一对多 关系 - 此时,任何 UNIT 都可以拥有一个 FILE。这与 OP 在该问题的第四条评论中提供的(诚然很小的)数据样本一致。
  • 我明白你的意思——我被“优化”这个词分散了注意力,并假设原始模式已经完成并且所有 FD 都是 3NF。从这个角度来看,添加新关系必须是反规范化的。看起来 OP 通过添加 UNIT -> FILE FD 来完成架构。正如您所指出的,添加这将原始模型中隐含的 Many:Many UNITFILE 关系解析为 1:Many。干得好+1
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 2014-07-13
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多