这张表中哪个最高的正常形式?

时间:2017-12-09 15:07:30

标签: database database-design relational-database database-normalization

Ticket Vname Nname
1      Oli   Seitz
1      Andi  Hofmann
2      Oli   Seitz
2      Oli   Schmidt
2      Tim   Schmidt
3      Tim   Hofmann

此表表示人员(Vname, Nname)和门票(Ticket)的映射。 VnameNname共同标识了某个人,但每个人(Vname, Nname)都可以拥有多个故障单(Ticket),并且可以将故障单分配给多个人。

此表中的PK都是三列。所以这个表应该是1NF,因为一列中没有多维数据。

但后来我很挣扎。我认为它是2NF和3NF因为我找不到任何功能依赖。 (希望他们被称为英语和德语功能)

有人可以解释这张表中哪个NF最高,为什么?我需要改变什么才能在5NF中制作它?

注意:这不是作业,这个问题来自讨论。

2 个答案:

答案 0 :(得分:3)

1NF(第一范式)

"1NF" has no standard meaning.

根据定义,关系每行每列有一个值,一列中的多维数据的概念"没有意义。随意让人们有意义。随意问他们他们的意思是什么意思。

归一化为更高的NF(正常形式)

对更高的NF进行标准化的唯一问题与" 1NF"是他们都试图简化以改进设计。

您的关系不满足任何非平凡的FD(功能依赖性)。所以它在 BCNF

您的关系不满足任何非平凡的MVD(多值依赖关系)。即它不满足任何非平凡的二进制JD(连接依赖性)。也就是说,除了包括它自己的一对之外,它不是任何一对投影的成员的连接。所以它在 4NF 。你可以通过成对的投影并加入它们来看到这一点。您也可以通过应用FD& amp;的定义来实现。 MVD并识别它们,然后应用推理规则。

您的关系满足非平凡的JD *{{Ticket, Vname}, {Vname, Nname}, {Ticket, Nname}}。因此,除了包含自身的集合之外,它是一组预测的成员的连接。但是它的CK不暗示JD。即它的投影没有连接链,其中每个连接的共同属性包括原始的CK。所以它不在 5NF 。你可以通过一组投影并加入它们来看到这一点。没有算法可以确定关系比复杂性更能满足复杂性的非平凡JD。

关系含义/谓词

另一方面,假设您知道关系的含义,只要您知道它包含从(特征)谓词中生成真实语句的元组< / em>表达为他人的结合,说

    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的设计使得其输出的谓词是其输入的谓词的AND。因此,您将知道检查原始的任何相应分解是否满足JD(即,来自合取的关系是否是原始的投影),以便检查JD是否被原始CK暗示。 / p>

对更高NF的归一化点是,当关系的谓词可以表示为其他谓词的结合并且它们的关系是原始的投影时,JD成立,因此我们可以使用更简单的单独关系,除了我们可能在成对共享CK上JOIN / AND关系/谓词,因为仍然没有更新异常。 (如果FD {x, ...} -> a成立,则某个MVD成立并且某个二进制JD成立,并且该关系的谓​​词可以表示为... AND a = f(x, ...)。)

请注意,与5NF减少更新异常的说法相反,事实证明它们在BCNF和BCNF之间的ETNF消失了。 5NF。但是,在将AND添加到谓词的代价中,关系较少的意义上,5NF设计仍然更简单。注意MVDs&amp;持有的JD很难找到只是因为使用它们的设计在直觉上显然很糟糕所以它们永远不会被提议,因为它们的谓词是其他人的结合。因此,与5NF不重要的说法相反,因为违反JD很少见,5NF是唯一重要的NF。 (SQL系统不支持处理5NF设计可能产生的所有完整性约束,因此无知导致人们声称应该满足3NF。)

您需要找到NF的定义重要的原因

更多重新predicates & the relational model

(我只回答了这个问题,因为即使在教科书中,获得的智慧也是如此混乱。)

<强>附录

预测&amp;连接。 (我打算将Minimal, Complete, and Verifiable Example留给你。但JD持有的另一位回答者对here is an sqlfiddle提出异议。)

T
1      Oli   Seitz
1      Andi  Hofmann
2      Oli   Seitz
2      Oli   Schmidt
2      Tim   Schmidt
3      Tim   Hofmann

project Ticket, Vname (T)
1      Oli
1      Andi
2      Oli
2      Tim
3      Tim

project Vname, Nname (T)
Oli   Seitz
Andi  Hofmann
Oli   Schmidt
Tim   Schmidt
Tim   Hofmann

project Ticket, Vname (T) join project Vname, Nname (T)
1      Oli   Seitz
1      Oli   Schmidt
1      Andi  Hofmann
2      Oli   Seitz
2      Oli   Schmidt
2      Tim   Schmidt
2      Tim   Hofmann
3      Tim   Schmidt
3      Tim   Hofmann

project Ticket, Nname (T)
1      Seitz
1      Hofmann
2      Seitz
2      Schmidt
3      Hofmann

     project Ticket, Vname (T) join project Vname, Nname (T)
join project Ticket, Nname (T)
1      Oli   Seitz
1      Andi  Hofmann
2      Oli   Seitz
2      Oli   Schmidt
2      Tim   Schmidt
3      Tim   Hofmann

答案 1 :(得分:1)

谓词是:

[p1]为姓名(FirstName)(姓氏)的人分配了票号(票证)。

约束:

  • (c1.1) 人员由名字和姓氏标识。
  • (c1.2) 故障单由故障单编号标识。
  • (c1.3) 对于每个人,可以为该人分配多张票。
  • (c1.4) 对于每张故障单,该故障单可能会分配给多个人。
PersonTicket {FirstName, LastName, Ticket}
         KEY {FirstName, LastName, Ticket}

NF推理:

  1. 该表是全键的,因此它位于BCNF中。
  2. 在BCNF中,不可能通过分解来减少冗余,因此它在第5个NF中。
  3. 它位于第5个NF和所有键中,因此它位于第6个NF 中。
  4. 请注意,关于NF的推理不需要任何数据,它必须对空的关系变量(表)以及表可能包含的任何可能的有效值有效。

    另请注意,谓词[p1]是一个简单谓词,它概括了简单(基本)事实,这是第6个NF的标志。例如,事实&#34; Person named Oli Seitz is assigned ticket number 1.&#34; 不能丢失信息,不能分成两句话。

    修改

    这是一个长时间的讨论(见评论),所以我必须稍微扩展一下答案。

    我的基本前提是表格{Ticket, Vname, Nname}不能分解为投影,或者从技术上说是加入依赖:

    JD *{{Ticket, Vname}, {Vname, Nname}, {Ticket, Nname}}
    

    成立。 (注意:Vname =名字,Nname =姓氏)。

    让我们仔细看看这个。 JD持有什么意味着什么? JD可以用语言表达:

      

    如果为姓名第一的人分配了票号 AND a   具有姓氏的人被分配了该票号 AND   存在具有该名字和姓氏那么的人   具有该名字和该姓氏的人被分配该票证   编号

    当你第一次读到这篇文章时,可能会感觉正确, - 一两分钟 - 但完全错误

    看看这个例子:

         Original       |             Three Projections
                        |
    (T,  First,  Last ) | (T, First)  (First,   Last )  (T,   Last )
    ----------------------------------------------------------------- 
    (1, 'Tom', '.....') | (1, 'Tom')  ('Tom', '.....')  (1, '.....')
    (1, '...', 'Jones') | (1, '...')  ('...', 'Jones')  (1, 'Jones')
    (2, 'Tom', 'Jones') | (2, 'Tom')  ('Tom', 'Jones')  (2, 'Jones')
    

    请注意元组的连接

    (1, 'Tom) ('Tom', 'Jones') (1, 'Jones')
    

    产生额外的元组

    (1, 'Tom', 'Jones')
    

    不在原件中;因此JD 不能

    松散地,人物标识符(First, Last)被分开。因此,人的名字和姓氏彼此独立行事;严重的逻辑错误

    似乎原始问题中的样本数据经过精心设计,以显示JD持有; 原始数据样本将通过此测试。但是,在原始表中只插入一个元组(行):

    (1, 'Tim',  'Seitz')
    

    现在再次测试,这个在连接投影时生成两个额外的元组

    (1, 'Tim', 'Hofmann')
    (2, 'Tim', 'Seitz')
    

    在推理部分,我使用了以下术语:简单谓词,基本事实,信息,标识符和减少冗余。在下面的评论中,这些被标记为:模糊的非技术性,不健全,错误,模糊,无关和无意义的

    有趣的是,这些模糊,模糊,荒谬等术语导致了正确的结果,而不是精确的,高度技术化的(算法辅助的?)&#34;导致严重逻辑错误的方法

    所以,对于那些想要仔细研究这些 - 恕我直言非常有用和实用 - 的术语的人,我可以提出一些参考文献。

    [1] 关于简单谓词第6个NF

    ℃。 J.日期;数据库设计与关系理论;
    第三部分,第13章,第六范式

    [2] 关于基本事实

    特里哈尔平,托尼摩根;信息建模和关系数据库;
    第3章,概念建模:第一步

    Terry Halpin,什么是基本事实?,论文1993年。

    [3] 关于第5个NF并减少冗余

      

    &#34; 要说relvar R在第5个NF中就是说进一步的非损失   将R分解为投影可能是可能的,但它不会   消除任何裁员。&#34;

         

    &#34; 5NF保证不会出现可以通过删除的冗余   。投影&#34;

         

    ℃。 J.日期;大师班(视频):数据库设计和关系理论;
      标准化JDs和5NF(正式) - 第2部分2

    [4] 关于谓词和命题

    第一部分,第二章,谓词和命题
    第五部分,第15章,数据库设计是谓词设计
    in:C。J. Date;数据库设计与关系理论。

      

    &#34;从概念上讲,数据库是一组表达的句子   关于UoD的命题。&#34;

         

    特里哈尔平,托尼摩根;信息建模和关系数据库;
      第2章,信息级别和框架