【问题标题】:Achieving SQL 3NF normalisation实现 SQL 3NF 规范化
【发布时间】:2012-03-31 15:16:31
【问题描述】:

我正在尝试使用我拥有的数据实现 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

【问题讨论】:

  • 了解为什么您尝试实现 3NF 可能会有所帮助(如果这是作业,您可以添加作业标签吗?人们愿意提供帮助,但更愿意知道)。另外,您认为不是 3NF 的设计是什么?
  • 我添加了一个作业标签,但我忘了这样做,我正在尝试学习规范化,我想这样做只是为了帮助我了解更多
  • 我只是想确定我做的对吗?
  • 您可能应该有一个 person 表并将其用于“部门主管”,但它可能会添加很多无用的连接。

标签: database oracle database-design normalization


【解决方案1】:

规范化要求您了解架构的各个部分之间的关​​系。直到 3NF 和 BCNF(几乎,但不完全相同——尽管你很难找到一个不属于 BCNF 的 3NF 的实际示例),最重要的特性是函数依赖性。

另一个关键点是“保护”;您不应该完全丢失列。例如,您原来的 Faculty 表有一个 ID 号、一个姓名和一个院长。您的修订版缺少教员姓名;这是您重新设计中的错误。

您已经确定每个系都属于一个学院,这似乎很合理。

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

您原来的学生表有一个课程/专业和一个学生组;这使得数据可能会在学生表中显示学生 X 正在做考古,但学生组表明学生 X 正在做音乐。这是允许的吗?如果不是,您是否最好将学生组放在学生表中,然后将其用于确定课程/专业、年份、部门以及教师?您修改后的架构将教员 ID 添加到学生表(但确实删除了课程/专业);这仍然会在数据中留下冲突的机会。

您需要一个表格来确定有效的学年吗?可能不是。是否应该有一张员工表,以便您识别院长和部门负责人。学院院长可以当系主任吗?教职员工以外的部门?

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2016-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2014-09-23
    • 2014-09-22
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多