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中教授。这是正确的吗
学校作业很难,你经常得猜老师在想什么。有时我想知道他们是否在思考。从一个小数据样本中猜测约束是一个非常糟糕的想法
以下是我的建议,依我看:
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粗略地说,FDX->Y
的意思是:如果你知道X,你就知道Y。在你的示例中,给定的标题有多个{YEAR,SESSION}
,所以不。@user3118602如果你对自己的个人/专业项目的NFs和数据库设计感兴趣,那么看看:如果你必须通过考试,那就做你必须通过的事情。