Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 正常化为4NF?_Database_Database Design_Database Normalization - Fatal编程技术网

Database 正常化为4NF?

Database 正常化为4NF?,database,database-design,database-normalization,Database,Database Design,Database Normalization,鉴于下表: Title Session Year Credit C21 2 2018 6 C21 3 2018 6 C21 4 2018 6 C21 2 2019 6 C21 3 2019 6 C21 4 2019 6 D22

鉴于下表:

Title    Session    Year     Credit
C21         2       2018       6
C21         3       2018       6
C21         4       2018       6
C21         2       2019       6
C21         3       2019       6
C21         4       2019       6
D22         2       2018       4 
D22         3       2018       4
D22         4       2018       4
D21         3       2019       4
D21         4       2019       4
使用关系模式:主题(标题、会话、年份、学分)

是否有可能将上述标准化为4NF

标准化为4NF的标准是,它需要满足BCNF,并且对于给定a->B的单个值,存在多个B值。我在理解和将粗体字应用于表格时遇到困难

我的尝试:

该表具有会话、年份和信用的重复属性。基于粗体语句(和BCNF-met),我将把它规范化为4NF

Title    Session   
C21         2   
C21         3      
C21         4    
D22         2  
D22         3   
D22         4  

Title    Year   
C21      2018  
C21      2019
D22      2018
D22      2019

Title    Credit 
C21        6  
D22        4    
不过,我在3个分解表上存在冲突,因为3个属性(会话、年份、学分)看起来不像与标题的独立关系


有人能提供建议吗?

每当您想要规范化数据关系时,首先要做的就是列出所有关系

  • 科目有题目和学时

  • 一个主题有多个会话

  • 一门学科分多年教授

  • 一个会议在一年内举行

那么,让我们从一个主题表开始

Subject 
-------
Subject ID
Subject Title
Subject Credit Hours
主题ID是一个盲自动递增整数主键

到目前为止看起来不错

现在,让我们创建一个会话表

Session
-------
Session ID
Session Number
Session Year
Subject ID (FK)
Session
-------
Session ID
Session Number
Session Year

SubjectSession
--------------
SubjectSession ID
Subject ID
Session ID
会话ID是另一个盲自动递增整数主键

我们可以通过将Subject ID外键移动到连接表来分解会话表以删除重复的会话号

Session
-------
Session ID
Session Number
Session Year
Subject ID (FK)
Session
-------
Session ID
Session Number
Session Year

SubjectSession
--------------
SubjectSession ID
Subject ID
Session ID
到目前为止看起来不错。我们来填桌子吧

Subject ID  |  Subject Title  |  Subject Credit Hours
----------------------------------------------------- 
         1  |       C21       |           6
         2  |       D21       |           4
         3  |       D22       |           4

Session ID  |  Session Number  |  Session Tear  
----------------------------------------------
         1  |         2        |      2018    
         2  |         3        |      2018   
         3  |         4        |      2018     
         4  |         2        |      2019      
         5  |         3        |      2019      
         6  |         4        |      2019   
       
SubjectSessionID  |  SybjectID  |  Session ID
---------------------------------------------
               1  |          1  |           1
               2  |          1  |           2
               3  |          1  |           3 
               4  |          1  |           4
               5  |          1  |           5
               6  |          1  |           6
               7  |          3  |           1
               8  |          3  |           2
               9  |          3  |           3
              10  |          2  |           5
              11  |          2  |           6
我不认为这一年需要被打破。它是会话定义的一部分,即使它会重复

我不知道这是否是4NF,但这是我所能做到的标准化了。

——一年中讲授的科目名称,课时,
--值得信任。
--
主题{标题、课程、年份、学分}
给定谓词和数据样本,明显的
FD
TITLE->CREDIT
,因此可以将
subject
分解为:

r1{头衔,学分}
r2{标题,届会,年份}
在考虑NFs时,重点关注谓词和约束(逻辑)是很重要的。样本数据很有用,但很少能说明全部情况。对于任何一组有效行,表位于特定的
NF
中,包括空集

根据数据样本,可以将
{TITLE,SESSION,YEAR}
分解为
{TITLE,SESSION}
{TITLE,YEAR}
,就像您尝试的那样。更正式地说,它看起来像是连接依赖项

*{{TITLE,SESSION},{TITLE,YEAR}}
有效

让我们看看我是否能用语言表达:

如果一个(学科)题目是在课程中教授的,而一个题目是在一年中教授的,那么这个题目就是在那一年的课程中教授的

这有意义吗?这合乎逻辑吗

如果这有意义,那么您的初始解决方案
{TITLE,SESSION},{TITLE,YEAR},{TITLE,CREDIT}
这是正确的。然而,2020年和2021年会发生什么?该规则规定,如果在2021年教授标题C21,则必须在课程2、3、4中教授。这是正确的吗

学校作业很难,你经常得猜老师在想什么。有时我想知道他们是否在思考。从一个小数据样本中猜测约束是一个非常糟糕的想法


以下是我的建议,依我看:

  • 连接依赖项不成立
  • FD
    TITLE->CREDIT
    有效
  • ——主题标题值得学分。
    --
    主题{头衔,学分}
    PK{TITLE}
    --科目名称在年、课时讲授。
    --
    主题{标题,届会,年份}
    PK{标题,届会,年份}
    

    它们现在都在
    6NF
    中,因此在:
    5,4,BCNF,3,…
    中。这是当且仅当我正确理解谓词和约束时。看看。

    感觉这取决于如何解释关系模式来进行规范化?@user3118602:是的。您必须获得正确的关系才能获得某种程度上正确的规范化。@user3118602:“感觉这取决于如何解释关系模式来进行规范化?”是的。规范化取决于每列的含义。您是在规范化该值还是一个可以保存该值的模式/变量?“4NF是指它需要满足BCNF,并且对于给定a->B的单个值存在多个B值”,这不清楚或4NF的定义不明确。请在教科书中找到一个并应用它,当卡住时问一个问题。继续这个问题是没有意义的,因为答案只是告诉你去做。要求我们用一个定制的例子重写一本教科书太宽泛了。此外,您的尝试需要引用定义或已发布的算法作为理由,或者您所做的是不合理的。Re“is this right”:按照参考/教科书显示您的工作步骤,有理由——并不是所有的术语/符号都是标准的&我们不知道你遵循的是什么算法/方法&我们想检查你的工作,但不想重做&我们需要你在流程允许的情况下做出选择&否则我们无法告诉你哪里是对的或错的&我们不想重写你的教科书。请看,点击谷歌的“stackexchange家庭作业”和鼠标文本上方的投票箭头。如果你不确定它是否正确,问一个具体的问题:你在哪里被卡住了。谢谢Damir。关于FDs,标题->年,会议不是FDs的一部分吗?很抱歉,如果这是一个愚蠢的问题,相对较新,并且希望得到正确的答案。@user3118602粗略地说,FD
    X->Y
    的意思是:如果你知道X,你就知道Y。在你的示例中,给定的
    标题有多个
    {YEAR,SESSION}
    ,所以不。@user3118602如果你对自己的个人/专业项目的NFs和数据库设计感兴趣,那么看看:如果你必须通过考试,那就做你必须通过的事情。