标准化为 4NF?

Normalize to 4NF?

给出以下 table:

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(title, session, year, credit)

是否可以将上面的归一化为 4NF?

规范化为 4NF 的标准是它需要满足 BCNF 并且 对于给定 A->B 的单个 A 值,存在 B 的多个值。我无法理解并将粗体应用于 table.

我的尝试:

table 重复了 session、年份和信用的属性。基于大胆的说法(和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 个分解的 table 上存在冲突,因为 3 个属性(session、年份、信用)看起来不像与标题的独立关系。

有人可以指点一下吗?

每当您想要规范化数据关系时,您要做的第一件事就是列出所有关系。

  • 一个主题有一个标题和学分。

  • 一个主题有多个session。

  • 一门学科讲授多年。

  • 一个session在一年内。

那么,让我们从主题开始 table。

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

主题 ID 是盲自增整数主键。

到目前为止看起来还不错。

现在,让我们创建一个 Session table。

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

Session ID 是另一个盲自增整数主键。

我们可以通过将主题 ID 外键移动到连接点 table.[=14= 来分解 Session table 以删除重复的 session 数字]

Session
-------
Session ID
Session Number
Session Year

SubjectSession
--------------
SubjectSession ID
Subject ID
Session ID

到目前为止看起来还不错。让我们填写 tables

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

我认为年份不需要细分。它是定义 session 的一部分,即使它会重复。

我不知道这是否是 4NF,但这是正常化的。

-- 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, SESSION, YEAR}

考虑 NFs 时,重要的是要关注谓词和约束 -- 逻​​辑。示例数据很有用,但很少能说明全部情况。 table 位于特定的 NF 中,适用于任何一组有效行,包括空集。

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

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

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

If a (subject) title was taught in session, and a title was taught in a year, then that title was taught in that session in that year.

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

如果这有意义,那么您的初始解决方案 {TITLE, SESSION}, {TITLE, YEAR}, {TITLE, 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, SESSION, YEAR}
        PK {TITLE, SESSION, YEAR}

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