- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始自学数据库的基础知识,目前正在研究1.到3.普通形式。到目前为止,我了解的是希望消除冗余,以使我的数据库在数据更改阶段不太容易出现不一致的情况,并希望通过消除尽可能多的重复项来节省空间。
例如,如果我们有一个包含以下各列的表:
CD_ID
标题
艺术家
年
并将设计更改为具有多个表,其中第一个(CD)包含:
CD_ID
标题
artist_ID
第二个(艺术家)包含:
artist_ID
艺术家
年
我看到在原始表格中,年份通过艺术家临时取决于ID。因此,我们想摆脱这一点,并为艺术家创建一个表,以便我们的新CD表现在处于第三范式。
但为此,我创建了另一个表(艺术家表),据我所知,该表也不是第三范式,因为我们具有与之前在另一个表中相同的传递依赖类型。
这是正确的吗?如果是,我还应该将Artist表标准化为3rd NF吗?我什么时候停止?
最佳答案
TL; DR您需要遵循已发布的算法来分解为给定的正常形式。
PS由于您引入了新的专栏,因此您没有通过归一化从原始CD中获得Artist。但是假设表Artist具有明显的意义。为什么您认为它“据我所知仍然不是第三范式”?如果原始CD中的artist-> year,则在Artist中也是如此。但是随后{artist}与{artist_id}一起是Artist的CK(候选密钥),而Artist位于3NF(和5NF)中。
从问题的原始版本加上当前版本,您将获得一个建议的基本表CD,其中的列cd_id,title,group和year包含元组,其中cd cd_id标题为title的标题是由year年形成的group group组成的。列cd_id是唯一的,因此是CK。 FD {group}-> year也成立。
规范化不会引入新的列名。它用其他人替换了提议的基本表,每个基本表都有其列的较小子集,这些子表始终连接到其本来的值。到BCNF的归一化基于FD(功能依赖性),FD也决定了基表的CK。因此,您的问题不包含分解。可能使人想起您的问题的分解(可能具有或没有任何特定的属性)将是具有列集{cd_id,title,group}和{group,year}的表。
其他FD保留在原件中。有些人因为列是什么而持有;由于CK而有些搁置;因为{group}->年成立,所以有些成立;通常,某些人持有,因为这三个人都这样做。也许其他人之所以持有,是因为应该将哪些元组纳入该关系中以及可能出现什么情况。您需要确定每个可能的FD是否成立。
当然,您可能已经被告知,在这种情况下必须持有的只有那些。但是您不会被告知唯一拥有的FD是{group}-> year,因为存在琐碎的FD,并且CK的每个超集在功能上决定了每组列。
3NF的一种定义是,关系位于2NF中,并且没有任何非素数列在功能上都依赖于任何CK。 (请注意,每个条件都涉及其他定义。)如果要使用它来确定您的关系是否在3NF中,则接下来需要找出所有CK都是什么。您可以通过适当的算法来最快地完成此操作,但是您只能看到哪些列集在功能上确定了每一列,但其中不包含较小的此类集,因为它们是CK。然后检查定义中的两个条件。
如果要归一化为3NF,则需要遵循一种算法分解为3NF。您没有解释您认为应该遵循的流程。但是,如果您未遵循经过验证的算法,那么您选择的任何组件都可能会或可能不会始终加入原始组件,并且可能会或可能不会都以任何特定的较高范式形式存在。请注意,您看到的分解示例不是分解算法的表示。
NF(范式)定义给出了关系必须满足的条件才能包含在该NF中。他们没有告诉您如何对较高NF中的关系进行无损分解(如果可能,保留FD)。人们已经研究出了生成特定NF分解的算法。 (并且分解为给定的NF通常不涉及先分解为较低的NF。经过较低的NF实际上可以防止在按较高的NF进行分解时生成原始的较高NF的良好分解。)
您可能还没有意识到,当某些FD持有时,某些其他FD必须持有。后者可以通过前者的阿姆斯特朗公理来确定。因此,仅仅因为您分解摆脱了某个FD,而该FD的存在违反了一个特定的NF,并不意味着就不会有您不曾处理过的其他违反它的FD。它们可以存在于新组件中。否则它们可能不会以有问题的方式出现,从而使您无法“保留”它们,从而导致设计不佳。
在大学/大学教科书/课程/演示中,了解特定的NF算法,以及有关NF和标准化本身的信息。许多在线。
关于mysql - 在规范化过程中创建非规范化表的现有做法/准则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307727/
我有一个如下图所示的情节。对于这个情节,我想在情节(右下角或左下角)的某处添加类似的线图。我正在使用的子图的命令是 plot( 1:121, sample(1:121),type='l' ) 它绘制在
我有一个单表数据库,我继承并迁移到 SQL Server,然后通过创建、链接和填充一大堆表示主表中项目的查找类型表来规范化它。我现在想用它们的外键替换原始表中的那些项目。我是不是一直在写一堆查询或 U
我有一个 Web 应用程序,它当前正在从服务器获取 PDF 的 base64 表示。我可以使用 Mozilla 的 pdf.js 在 上显示它并使用下拉菜单切换页面。 根据我所能找到的一切和Can
在 DB2 上运行的 Moodle 2 安装中,删除用户不成功,返回从数据库读取错误: Debug info: [IBM][CLI Driver][DB2/LINUXX8664] SQL0206N "
我在grails项目的RH包中添加了一个名为Authorization的新域类。 然后,我从grails菜单自动生成了 Controller 和 View 。 但是当我尝试输入 Controller
今天,我发现了一个有趣的plunker,经过谷歌大量搜索后一无所获,希望我能在这里找到答案。我只是想要那个笨蛋的副本。我不想使用复制和粘贴技术。有什么方法可以获取已建立的 plunk 的副本吗?我如何
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Migrate normal sqlite3 database to core data? 是否可以将现有的 sql
我正在尝试在我的应用程序上添加启动画面。我干净地构建了程序,但我选择了错误的文件。现在我第二次编辑了 VM 选项并再次干净构建,现在我收到此错误: C:\Users\User\Documents\Ne
我已经查看了很多问题,我不相信这是重复使用单元格的结果,因为新的单元格图像是正确的,但是现有的单元格图像不正确并且曾经是正确的。我会先发布图片,以便更容易理解问题。 我有一个图像单元的 Collect
我在来自 Vaadin 的 ContainerHierarchicalWrapper 的这段代码中有一个非常奇怪的错误: for (Object object : children.keySet())
到目前为止,我正在使用 Globalize用于我的 JavaScript 应用程序的 i18n 和 l10n(使用 jQuery UI 构建)。这行得通,但它将我的代码与另一个特定的库联系在一起。现在
我正在创建一个 JHipster 应用程序,现在确定了 full text search 的必要性.我知道 JHipster 与 Elasticseach 集成,但我在创建项目时没有启用它。有没有一种
我一直在寻找堆栈中的建议,但我仍然不能 100% 确定改进它的最佳方法。我有一个存储大约 130K 条记录的 mysql INNODB“产品”表。杂项产品数据等大约有 80 个字段,然后我们一直在为每
我在一本书上看到,它说:当我们使用另一个初始化新创建的对象时 - 使用复制构造函数创建一个临时对象,然后使用赋值运算符将值复制到新对象! 后来在书中我读到:当使用另一个对象初始化新对象时,编译器创建一
我第一次安装现有的 Django 项目时遇到了启动服务器 python manage.py runserver 的问题 这是我做的 1.克隆仓库, 2.制作虚拟环境 3.pip安装要求.txt 4.生
我有一个网站,还有一个登录表单。我不想使用 PHP 来检查我的 MySQL 数据库,因此我正在寻找一种方法来检查用户凭据以查看是否已有 Linux 用户。我知道 PAM,但我还没有找到任何有关如何从网
我有一个现有的 Umbraco 项目在 IIS 服务器上运行。当我开始这个项目时,我基本上是将 Umbraco 直接安装到服务器上,并通过管理界面进行编码,直到网站启动并上线。 现在,客户想要一些更改
我是 Android 开发新手,目前正在学习一些教程。当我在 Eclipse 中设置一个新的 Android 项目,并选择 Windows -> Android SDK and AVD Manager
我有这个注册页面可以正常工作,但对于电子邮件字段,我需要确保电子邮件正确有效1:正确2 : 有效 为了正确添加电子邮件,我正在使用 Java 脚本验证来维护abc@def.com 很好用 但我的问题是
首先让我说我不熟悉 COM 引用,并且我在 Windows 7 64 位计算机上使用 VS2010。今天早上,我从 TFS 中删除了一个现有项目。然后我尝试构建项目并收到此错误: The type o
我是一名优秀的程序员,十分优秀!