问题描述
给出下表:
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}
给定谓词和数据样本,显而易见的FD
为TITLE -> 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。这是正确的吗?
学校作业很难,您常常不得不猜测老师在想什么。有时我想知道他们是否在思考。从少量数据样本猜测约束是一个非常糟糕的主意。
这是我的建议,我的看法:
- 该连接依赖项不成立。
- 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,但这与我将其标准化的程度一样。