范式:4 vs 5

2024-01-11

我正在努力理解 4NF、5NF 以及它们的区别。

这是我向不知道的人描述 4/5NF(或者,我如何描述实现它的步骤)的方式。我这样说是因为这将显示我真正理解的内容。

通常,N:N 实体关系应通过为其可能的组合建立一个连接表来实现。如果有 3 个或更多实体以 N:N 关系连接,则应仔细考虑:

  1. 更一般(包括)的解决方案是实现一个连接表,其中包含所有实体作为字段,并将它们的所有组合作为值(行)
  2. 然而,如果这些实体之间的关系不是真正的关系 每个完整元组的情况,而是(某些)的(笛卡尔)乘积 他们的二元 N:N 关系,然后仔细考虑最小值 所需的两字段表的数量。
  3. 概括 2,总是更喜欢(当然,如果它是正确的)连接表的字段尽可能少。显然,如果没有用处,就不要创建连接表。
  4. 区分上述内容的一个有用提示是,当插入完成时,如果您的心(!)告诉您正在做冗余或无效的事情,那么您应该选择后面的方法之一。

E1) 维基百科关于 4NF 的页面示例:https://en.wikipedia.org/wiki/Fourth_normal_form https://en.wikipedia.org/wiki/Fourth_normal_form

我们有实体餐厅、披萨品种和送货区。我们可以通过一个连接表(包括所有三个)来实现它们的多对多关系。然而,如果正确地思考这些数据,这些三元组只是 2 个 N:N 关系的产物:餐厅:比萨饼和餐厅:送货区。如果“A1 Pizza”餐厅决定将“Thin Crust”披萨品种纳入其保留范围,那么我必须将具有相同餐厅/披萨品种的一行插入“A1 Pizza”的所有送货区域,这将感觉 4 .多余的,或者只插入特定的送货区域,这会让人感觉无效。 4.因为没有商店会为送货区域提供更少的品种(或者至少,我们的规范是这么说的)。

E2) 维基百科关于 5NF 的页面示例:https://en.wikipedia.org/wiki/Fifth_normal_form https://en.wikipedia.org/wiki/Fifth_normal_form

我们有实体“推销员”、“品牌”和“类型”。我们可以通过一个连接表(包括所有三个)来实现它们的多对多关系。然而,由于“以下规则适用”部分,三元组实际上是 3 个可用的 N:N 关系的(笛卡尔)乘积,因此,正确的方法是为其拥有 3 个连接表。 “注意此设置如何帮助消除冗余。”这部分很像我的第四点。

这种情况变得更加令人困惑,因为虽然文章指出“另请注意该表位于 4NF 中”,但事实是,如果该表具有它应该包含的所有行,以便涵盖“以下规则”,那么它不会涵盖 4NF!正确的?

那么..什么是 E1 和 E2 之间的差异使得其中一个成为 4NF,并且 还有一个 5NF 的例子吗?


E1 和 E2 之间有什么区别,使得其中一个是 4NF,另一个是 5NF 示例?

由于 JD,非 4NF 和非 5NF 关系都表现出更新异常; 4NF 意味着二进制 JD 没有异常,5NF 意味着任何数量的 JD 都没有异常。维基百科示例标准化为 4NF 消除了二进制 JD——该关系是一个有问题的双向连接。 5NF 规范化消除了 3 路 JD——该关系是一个有问题的 3 路连接。 (由于它是从 4NF 开始的,所以它不可能有任何有问题的二进制 JD。)


关系(值或变量)在 5NF 中,当它可以无损分解(即连接回它的投影)(即相应的 JD(连接依赖)保持)时,组件可以按某种顺序连接回来,其中每个连接的公共列是原始连接的超键。 (Fagin 的 PJ/NF 论文的隶属度算法。)4NF 的定义是相同的,只是它可以无损分解为two投影很重要(即相应的 JD 是二进制的)(即相应的 MVD(多值依赖)成立)。

(具有这样的连接序列的这种允许的 JD 被称为“由 CK(候选键)隐含”。)

这个想法是,如果我们可以分解为连接回原始的投影,那么我们就应该分解,除非超级键上的连接不会导致任何问题/异常。

当 FD(函数依赖)S -> A 与属性集 R 存在关系时,该关系在 S U {A} 和 R - {A} 上可无损分解。因此 JD {S U {A}, R - {A}} 成立且 MVD S ->> {A} 成立。

From 该表采用哪种最高范式? https://stackoverflow.com/q/47729927/3404097

关系含义/谓词

另一方面,假设你知道关系的含义到 您知道它包含做出真实陈述的元组的程度 从一个(特征)谓词可以表示为合取 其他人说

    ticket Ticket was submitted by a person with first name Vname
AND there is a person with name Vname Nname
AND ticket Ticket was submitted by a person with last name Nname

Join 的设计使得其输出的谓词是 其输入的谓词。所以你会知道检查是否有 原始的相应分解满足 JD (即 合取关系是否是 原件),以检查 JD 是否是原件所暗示的 CK。

归一化到更高 NF 的要点是,当 关系的谓词可以表示为其他和的合取 它们的关系是原始关系的投影,所以我们可以使用 相反,更简单的单独关系,除非我们也可以 JOIN/AND 成对共享 CK 上的关系/谓词,因为有 仍然没有更新异常。 (如果FD{x, ...} -> a则保持一定的 MVD 持有 & 某个二元 JD 持有且谓词 关系可以表示为... AND a = f(x, ...).)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

范式:4 vs 5 的相关文章

  • 在 Access 数据库中对列包含数字和字母的数据进行排序

    请帮助我 因为我一直无法做到这一点 选择此列 columnA 的访问 SQL 是什么 以便它返回一个结果集 其中的不同值首先根据数字排序 然后根据字母排序 这是列值 10A 9C 12D 11G 9B 10C 9R 8T 我尝试过 从 tb
  • 无重复组合的交叉连接

    我知道这个问题与这个问题非常相似 对称交叉连接 https stackoverflow com questions 12490244 symmetric cross join还有这个 sql 中交叉连接的组合 不是排列 https stac
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 如何在事务中使用链接服务器插入远程表?

    我的链接服务器设置正确 我能够执行以下查询 插入 远程服务器 表 SELECT FROM 本地服务器 表 然而当我做同样的事情时交易内 开始传输 插入 远程服务器 表 SELECT FROM 本地服务器 表 提交交易 我收到类似的错误 用于
  • 通过Java从MySQL中获取大量记录

    有一个 MySQL 表 服务器上的用户 它有 28 行和 100 万条记录 也可能会增加 我想从这个表中获取所有行 对它们进行一些操作 然后将它们添加到 MongoDB 中 我知道通过简单的 从用户中选择 操作来检索这些记录将花费大量时间
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 我应该定义索引(A)和索引(B),还是索引(A,B),或者两者都定义?

    在我的表中 我有两个密切相关的列 A 和 B 我应该考虑哪些因素来决定是否创建 索引 A 和索引 B 索引 A B 以上两者 如果我 仅使用类似的查询where A 5 and B 10 并且从不喜欢where A 5 也可以使用类似的查询
  • 如何从 MySQL 中的布尔类型返回不同的字符串?

    如果我在 MySql 中将一列设置为布尔值 则查询将返回以下值 0 or 1 是否可以做这样的事情 SELECT bool value AS yes OR no 我的意思是 根据真假返回两个不同的字符串 SELECT CASE WHEN b
  • 手动更改postgresql中查询的执行计划?

    是否可以在postgresql中手动更改执行计划的操作顺序 例如 如果我总是想在过滤之前进行排序操作 尽管这在 postgresql 的正常使用中没有意义 是否可以通过例如手动强制执行该操作改变运营的内部成本 如果我实现自己的功能呢 是否可
  • SQL命令文本到DataSet的直接方法

    如果我有 sql 命令 获取数据集的最直接途径是什么 string sqlCommand SELECT FROM TABLE string connectionString blahblah DataSet GetDataSet sqlCo
  • sql server 2008 对 exec 语句的限制

    我只需要仔细检查 t sql 中的 EXEC 命令是否有字符限制 如果我有一个带有 varchar max 的变量并使用 EXEC 执行命令 你认为这样可以吗 thanks 应该没问题 根据这篇 MSDN 文章 http msdn micr
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 将图像列保存到 SQL Server 2000 中的文件

    我在 SQL Server 2000 中有一个包含图像列的表 我需要将图像数据保存到文件系统上的文件中 在 SQL Server 2005 中 我可以使用 ADODB Stream 对象进行文件 I O 但这在 SQL Server 200
  • SQL Server Like 查询不区分大小写

    Query SELECT from Table 2 WHERE name like Joe Output 1 100 Joe 2 200 JOE 3 300 jOE 4 400 joe 为什么不区分大小写 Problem 查询不区分大小写
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结
  • 如何使用第二行中的值填充第一行中的空值?

    我正在尝试编写一个查询 仅显示每个名称的第一行 但这些行的标题为空 因此我想从紧邻的下一行中提取它们的标题 table1 Name Title Row Dan NULL 1 Dan Engineer 2 Dan Developer 3 Ja
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 如何将事物的组合映射到关系数据库?

    我有一个表 其记录代表某些对象 为了简单起见 我假设该表只有一列 这是唯一的ObjectId 现在我需要一种方法来存储该表中的对象组合 组合必须是唯一的 但可以是任意长度 例如 如果我有ObjectIds 1 2 3 4 我想存储以下组合
  • 创建日期范围表

    我正在编写一份需要显示每天值的报告 我有查询的开始日期和结束日期 但我希望避免丢失日期 以防表不包含特定日期的值 我正在考虑创建一个基本日期范围表 其中包含开始和结束之间的所有日期 然后将其与数据表左连接以显示每一天的值 我找到了一些适用于

随机推荐