实现SQL 3NF规范化

时间:2012-03-15 04:58:43

标签: database oracle database-design normalization

我正在尝试使用我拥有的数据来实现3NF,但我感到困惑。这些是我的表格:

FACULTY table    DEPARTMENT table        STUDSGROUP table         STUDENT table
FACULTY_ID       DEPARTMENT_ID           STUDSGROUP_ID            STUDENT_ID
FACULTY_NAME     DEPARTMENT_NAME         ACADEMIC YEAR            STUDENTS_NAME
FACULTY_DEAN     HEAD OF DEPARTMENT      COURSE/SPECIALITY        STUDENTS_GROUP
                                                                  COURSE/SPECIALITY 
                                                                  DOB/DATE OF BIRTH

我想我可以这样做,但我认为我不对。

FACULTY table
FACULTY_ID,PK
DEAN

DEPARTMENT table
DEPARTMENT_ID,PK
FACULTY_ID,fk
DEPARTMENT_NAME
HEAD OF DEPARTMENT


STUDSGROUP table
STUDSGROUP_ID, pk
ACADEMIC YEAR
SPECIALITY

STUDENTS table
STUDENT_ID, pk
FACULTY_NAME,FK
STUDSGROUP_ID,FK
FIRST_NAME
LAST_NAME
DOB

1 个答案:

答案 0 :(得分:3)

规范化要求您知道模式的各个部分是如何相关的。高达3NF和BCNF(差不多,但不完全相同 - 虽然你很难找到一个不在BCNF中的3NF的实际例子),但最重要的特征是功能依赖。

另一个关键点是'保护';你不应该完全失去专栏。例如,您的原始Faculty表具有ID号,名称和院长。您的修订版本缺少教员姓名;这是你重新设计的一个错误。

你已经确定每个部门属于一个教师,这看起来似乎有道理。

您修改后的学生组表似乎与原始表相同。这可能没问题,但也许课程/专业部分意味着学生团体与部门相关联,因此也就是教师。如果是这样,那么您可能需要一个课程/专业表来确定课程/专业和部门,让学生小组确定课程/专业中的特定年级组。

您的原始学生表有一个课程/专业,也有一个学生组;这样就有可能数据会说学生X正在学生表中进行考古学,但学生组表示学生X正在做音乐。这是允许的吗?如果没有,您是否最好只在学生表中设置学生小组,留下来确定课程/专业,年级,部门,以及教师?您修改后的架构会向学生表添加教师ID(但会删除课程/专业);这仍然会在数据中留下冲突的机会。

您是否需要一张桌子来确定有效的学年?可能不是。是否应该有工作人员的桌子,以便您可以识别院长和部门负责人。教职员可以担任部门主管吗?教师以外的部门?