归一化为4NF?

问题描述

给出下表:

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

使用关系模式:SUBJECT(标题,会话,年份,学分)

是否可以将以上内容标准化为4NF?

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

我的尝试:

该表具有会话,年份和信用的重复属性。基于大胆的陈述(并满足BCNF),我将其标准化为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 TITLE taught in year YEAR,session SESSION,-- is worth CREDIT credits.
--
subject {TITLE,SESSION,YEAR,CREDIT}

给定谓词和数据样本,显而易见的FDTITLE -> CREDIT,因此可以将subject分解为:

r1 {TITLE,CREDIT}
r2 {TITLE,YEAR}

在考虑NFs时,重点放在谓词和约束上很重要-逻辑。样本数据很有帮助,但很少能讲述整个故事。对于特定的有效行集(包括空集),表位于特定的NF中。

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

* { {TITLE,SESSION},{TITLE,YEAR} }成立。

让我们看看是否可以口头表达出来

如果在 session 中教授了(主题) title ,并且在 year 中教了 title ,然后在该的那个 session 中教授了 title

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

如果这有意义,那么您的初始解决方案{TITLE,YEAR},CREDIT} 是正确的。但是,2020年,2021年会发生什么?该规则规定,如果 title C21是在 year 2021年教授的,则它必须处于 sessions 2,3,4。这是正确的吗?

学校作业很难,您常常不得不猜测老师在想什么。有时我想知道他们是否在思考。从少量数据样本猜测约束是一个非常糟糕的主意。


这是我的建议,我的看法:

  1. 该连接依赖项不成立
  2. FD TITLE -> CREDIT成立。
-- Subject TITLE is worth CREDIT credits.
--
subject {TITLE,CREDIT}
     PK {TITLE}


-- Subject TITLE was taught in year YEAR,session SESSION.
--
subject_ys {TITLE,YEAR}
        PK {TITLE,YEAR}

这两个现在都位于6NF中,因此位于5,4,BCNF,..中。那是当且仅当我能正确理解谓词和约束。看看this example

,

每当要标准化数据关系时,要做的第一件事就是列出所有关系。

  • 一个主题具有标题和学时。

  • 一个主题有多个会话。

  • 一个学科要教授多年。

  • 一个环节是一年。

因此,让我们从主题表开始。

Subject 
-------
Subject ID
Subject Title
Subject Credit Hours

主题ID是一个盲目的自动递增整数主键。

到目前为止看起来不错。

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

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

会话ID是另一个盲目自动递增整数主键。

我们可以通过将“主题ID”外键移至联结表来细分“会话”表以删除重复的会话号。

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,但这与我将其标准化的程度一样。