存在 practices/guidelines 用于在规范化过程中创建非规范化表?

Exist practices/guidelines for creation of non normalized tables during the normalization process?

我开始自学数据库的基础知识,目前正在学习 1. 到 3. 范式。到目前为止,我所了解的是希望消除冗余,使我的数据库在 data-change 阶段不太容易出现不一致,并通过尽可能多地消除重复项来节省 space 。

例如,如果我们有一个包含以下列的 table:

  1. CD_ID
  2. 标题
  3. 艺术家

并将设计更改为具有多个 table,其中第一个 (CD) 包含:

  1. CD_ID
  2. 标题
  3. artist_ID

第二个(艺术家)包含:

  1. artist_ID
  2. 艺术家

我看到在原版中 table 年份是通过艺术家的 ID 传递依赖的。所以我们想摆脱它并为艺术家们制作一张 table 以便我们的新 CD table 现在处于第三范式。

但为此我创建了另一个 table(艺术家 table),据我所知,它也不是第三范式,因为我们有相同类型的传递依赖就像之前在另一个 table.

这是正确的吗?如果是的话,我是否也应该将艺术家 table 标准化为 3rd NF?我什么时候停止?

TL;DR 您需要按照已发布的算法分解为给定的范式。

PS 你没有通过规范化从原始 CD 中获取艺术家,因为你引入了一个新列。但假设 table Artist 具有明显的含义。你为什么认为"again is not in third normal form as far as I understand it"?如果艺术家 -> 原始 CD 中的年份,那么它在艺术家中也是如此。但是 {artist} 与 {artist_id} 是 Artist 的 CK(候选键),而 Artist 在 3NF(和 5NF)中。


从你问题的原始版本加上当前版本,你有一个建议的基础 table CD,其中包含列 cd_id、标题、组和年份,包含元组,其中 cd cd_id 标题为 titlegroup 组创建于 year ].列 cd_id 是唯一的,因此是 CK。 FD {group} -> 年份也成立。

规范化不会引入新的列名。它用其他人替换了提议的基础 table,每个人都有其列的较小子集,这些子集始终与其值相结合。 BCNF 的规范化基于 FD(功能依赖),这也是确定碱基 table 的 CK 的因素。所以你的问题不包含分解。一个可能的分解让人想起你的问题,它可能有也可能没有任何特定的属性,将是 tables 与列集 {cd_id, title, group} 和 {group, year}.

其他FD保留原件。有些是因为列是什么而成立;有些因为CK而持有;有些是因为 {group} -> year 成立;一般来说,某些观点成立是因为所有这三个观点都成立。也许其他人持有是因为什么元组应该进入关系以及可能出现什么情况。您需要决定 每个 个可能的 FD 是否成立。

当然,您可能已经被告知,只有那些在那种情况下必须持有的人才能持有。但是你 不会 被告知唯一持有的 FD 是 {group} -> year,因为那里 are 琐碎的 FDs 和 CK 的每个超集在功能上确定每组列

3NF 的一个定义是关系在 2NF 中并且没有 non-prime 列在传递函数上依赖于任何 CK。 (注意每个条件都涉及其他定义。)如果你想用它来找出你的关系是否在 3NF 中,那么你接下来需要找出 all CKs 是什么。您可以通过适当的算法最快地完成此操作,但您只能看到哪些列集在功能上确定了每一列,但不包含较小的此类集,因为这些是 CK。然后检查定义中的两个条件。

如果要归一化为 3NF,则需要遵循分解为 3NF 的算法。您没有解释您认为应该遵循的流程。但是,如果您没有遵循经过验证的算法,那么您选择的任何组件都可能会或可能不会始终连接到原始组件,并且可能会或可能不会每个都处于任何特定的更高范式中。请注意,您看到的分解示例不是分解算法的演示


NF(范式)定义给出了一个关系必须满足的条件才能在该 NF 中。他们不会告诉您如何无损分解(尽可能保留 FD)到更高 NF 中的关系。人们已经制定出对特定 NF 进行分解的算法。 (并且分解为给定的 NF 通常不涉及首先分解为较低的 NF。通过较低的 NF 实际上可以防止在您根据较高的 NF 进行分解时生成原始的良好 higher-NF 分解。)

您可能还没有意识到,当某些 FD 成立时,其他某些 FD 也必须成立。后者可以通过前者的阿姆斯特朗公理来确定。所以仅仅因为你分解以摆脱一个特定的 FD,它的存在违反了一个特定的 NF,并不意味着没有一堆你没有处理的其他违反它的 FD。它们可以存在于新组件中。或者它们可能不会以有问题的方式出现,因此您没有 "preserved" 它们,而导致设计不佳。

在 college/university textbook/course/presentation 中了解特定的 NF 算法,以及与此相关的 NF 和规范化本身。多人在线。