【发布时间】:2017-07-24 17:14:32
【问题描述】:
我正在设计一个以“学期”为实体的基本课程数据库。这里我有两个属性“Season”(秋季、春季、夏季)和“Year”(2015、2016、2017)。
如果我用值 FALL16、SPRING16、FALL17 等替换这些属性以形成一个名为“Semester_Id”的键,我是否违反了第一范式?
【问题讨论】:
标签: database-design normalization
我正在设计一个以“学期”为实体的基本课程数据库。这里我有两个属性“Season”(秋季、春季、夏季)和“Year”(2015、2016、2017)。
如果我用值 FALL16、SPRING16、FALL17 等替换这些属性以形成一个名为“Semester_Id”的键,我是否违反了第一范式?
【问题讨论】:
标签: database-design normalization
通常,您希望这些值分别为 2016Fall、2016Spring 和 2016Summer,以便它们按正确的分组排序 - 假设年份是学年。
无需替换现有属性。年份和学期/季节的组合就像它们一样是一个非常好的复合键。不要害怕在有意义的地方使用复合键。
实际上,您可以考虑将学期推入他们自己的查找表中,并将学期属性设为它的 FK。让 Season 成为一个独立的实体将为您提供潜在有用的扩展。查找表中的数据可能如下所示:
ID Name Starts
0 Fall Last week of August
1 Spring First week after the first Saturday of January
2 Summer First week of May
可能有很多关于您可能想要维护的季节或学期的信息。
【讨论】:
如果我们将 Semester_id 视为一个复合属性,那么它将两个域组合成一列违反了 1NF。但是,如果它仅用作没有解释的标识符,则它表示在规范化关系中有效的单个域。
【讨论】: