标准化为 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}
给定谓词和数据样本,显而易见的 FD
是 TITLE -> 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。这是正确的吗?
学校作业很难,你经常要猜老师在想什么。有时我想知道他们是否在思考。从小数据样本猜测约束是一个非常糟糕的主意。
这是我的建议,我是这样看的:
- 连接依赖性不成立。
- 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.
给出以下 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}
给定谓词和数据样本,显而易见的 FD
是 TITLE -> 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。这是正确的吗?
学校作业很难,你经常要猜老师在想什么。有时我想知道他们是否在思考。从小数据样本猜测约束是一个非常糟糕的主意。
这是我的建议,我是这样看的:
- 连接依赖性不成立。
- 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.