您必须知道表格的含义以及业务规则是什么。
从你的问题来看,显然是相同的设计,识别功能依赖性 (FD):
括号标识主键属性:
(Student ID), Student Name, Student Address, Student Major, (Course ID), Course Title, Instructor ID, Instructor Name, Instructor Office, Student_course_grade
显然,该表(使用缩短的列名)的含义如下:
/*
student with id [si] and name [sn] and address [sa] and major [sm]
takes course [ci] with title [ct]
from instructor with id [ii] and name [in] and office [io]
with grade [scg]
*/
t(si,sn,sa,sm,ci,ct,ii,in,io,scg)
一张桌子带有这样一个(特征)谓词(又名成员资格标准,又名含义)--由列名参数化的填空(命名)语句模板。将列名的一行值插入到谓词中给出主张——真或假的陈述。表(基表或查询结果)保存根据其谓词得出真命题的行。
数据库设计的目的就是找到合适的谓词来记录您的业务需求。谓词可以表示为其他较小谓词的 AND/连接。当有帮助时将其分解为数据库规范化的目的。
您必须使用表的谓词/标准/含义和业务规则来弄清楚对于列的每个子集当它的给定值总是与另一列的一个值一起出现时,即 FD(功能依赖)所包含的内容。我们可以讨论保存在表值或表变量/模式中的 FD。类似地,对于超级键、CK(候选键)、PK(主键)和其他约束。 FD 保存在变量/模式中,当且仅当/当它保存在给定业务规则的情况下该变量/模式可能出现的每个可能值/状态时。
请注意,如果子集确定一列,则该列的所有超集也确定该列。当您知道给定子集可能会出现多个列值时,您还可以排除 FD。示例数据可能表明 FD 成立或不成立。了解一组 FD 的“传递闭包”和“最小覆盖”,以简洁地表达所有 FD。您必须表明您已经考虑了每个可能的决定因素,即对于列的每个子集,以及对于每个属性,FD 是否拥有确定该属性的集合。
每次分解时,您都必须决定是否希望给定组件仅保存原始行在其列上的投影,或者是否也可以保存其他行。例如。教授可以不教授课程而存在吗?如果是这样,则意味着您的原始谓词/表实际上不足以说明您想要的有关应用程序的所有内容,并且您需要一个额外的表,该表不是它的投影,而是具有相同的列。这通常被描述为标准化的一部分,但事实并非如此。注意到你的设计是wrong当你正在正常化时。
您可能必须进行假设,因为您不知道会出现什么情况。我们通常假设 ids 与已识别的实体是 1:1;是这样吗?一名学生可以有多个名字吗?如果不是,则 {si} -> sn。即使他们这样做了,表只会记录一个吗?如果是这样,谓词将变为“...并且具有已选择要记录的姓名 [sn]...”,并且涉及学生姓名的所有查询都将涉及“已选择要记录”的查询,并且上述FD成立。
- 每个课程 ID 仅教授一堂课。
- 学生最多可以选修 4 门课程。
- 每门课程最多可容纳 25 名学生。
- 每门课程仅由一名讲师教授。
- 每个学生可能只有一个专业。
什么是班级?是否存在值的子行与类的比例为 1:1,因此适用于类的内容也适用于这些子行?
ci 决定 ct 吗? ii 确定吗?根据规则,“每门课程仅由一名讲师教授”,并且该表包含“...从 ID 为 [ii] ... 的讲师那里学习课程 [ci] ...”的行。因此,给定的 ci 只能与一个 ii 一起出现。 FD。根据规则,“每个学生只能有一个专业”,表中包含“学生 ID [si] ... 和专业 [sm] ...” 的行。因此,给定的 si 仅与单个 sm 一起出现。 FD。根据规则,“学生最多可以选修 4 门课程”和“每门课程最多可以有 25 名学生”,并且该表包含“id [si] ... 的学生选修课程 [ci] ..”的行。 .”。所以si不能决定ci,当然也不能决定si。
未解答的问题必须由您和您的客户(教授)共同解决。
您只能从 FD 确定 CK(其中之一可以称为 PK)和其他超级键(唯一的列集)。如果给您 CK、PK 和/或其他超级键,根据定义,它们在功能上确定每一列。
(您的作业使用 E-R,因此您需要查找有关实体的谓词,然后查找有关标识实体的列集的相应谓词,从而获取表。)
From 我对你另一个问题的回答:
For 列的每个子集您需要决定哪些其他列对于这些列的给定子行值只能有一个值。当它只能有一个时,我们说列的子集在功能上决定了该列。我们说存在FD(功能依赖)columns->column。这时我们可以将某个函数 F 的表谓词表示为“... AND column=F(columns)”。(F 由表在列和列上的投影表示。)但是该子集的每个超集还将对其进行功能性确定,从而减少案例。相反,如果给定的集合不能确定列,则该集合的任何子集都不能确定列。正在申请阿姆斯特朗公理当给定 FD 成立时,给出所有成立的 FD。 (算法和软件可用于应用它们并确定 FD 闭合和覆盖。)此外,您可能会认为列集是唯一的;那么所有其他列在功能上都依赖于该集。这样的集合称为超级密钥。
之所以只需要对确定单个属性的 FD 应用业务规则和表谓词来查找 FD 是否成立,是因为阿姆斯特朗公理随后会查找哪些 FD 成立确定多个属性。