澄清 1NF 违规 - DBMS
Clarification on 1NF Violation - DBMS
我正在设计一个以 'Semester' 作为实体的基础课程数据库。这里我有两个属性 "Season" (Fall, Spring, Summer) 和 "Year" (2015, 2016, 2017).
如果我替换这些属性以形成一个名为 "Semester_Id" 的键,其值为 FALL16、SPRING16、FALL17 等,我是否违反了第一范式?
如果我们将 Semester_id 视为复合属性,那么它通过将两个域组合成一列来违反 1NF。但是,如果它仅用作标识符而不进行解释,则表示在规范化关系中有效的单个域。
通常,您希望值是 2016Fall、2016Spring 和 2016Summer,这样它们就会按正确的分组排序——假设年份是学年。
无需替换现有属性。 year 和 semester/season 的组合按照它们的方式构成了一个非常好的复合键。不要害怕在有意义的地方使用复合键。
实际上,您可以考虑将学期推入它们自己的查找中 table 并将学期属性设为 FK。使 Season 成为一个独立的实体将为您提供潜在有用的扩展。查找 table 中的数据可能如下所示:
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' 作为实体的基础课程数据库。这里我有两个属性 "Season" (Fall, Spring, Summer) 和 "Year" (2015, 2016, 2017).
如果我替换这些属性以形成一个名为 "Semester_Id" 的键,其值为 FALL16、SPRING16、FALL17 等,我是否违反了第一范式?
如果我们将 Semester_id 视为复合属性,那么它通过将两个域组合成一列来违反 1NF。但是,如果它仅用作标识符而不进行解释,则表示在规范化关系中有效的单个域。
通常,您希望值是 2016Fall、2016Spring 和 2016Summer,这样它们就会按正确的分组排序——假设年份是学年。
无需替换现有属性。 year 和 semester/season 的组合按照它们的方式构成了一个非常好的复合键。不要害怕在有意义的地方使用复合键。
实际上,您可以考虑将学期推入它们自己的查找中 table 并将学期属性设为 FK。使 Season 成为一个独立的实体将为您提供潜在有用的扩展。查找 table 中的数据可能如下所示:
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
可能有很多关于您可能想要维护的季节或学期的信息。