Third Normal Form(第三范式)

Posted by 刘知安 on 2018-11-15
文章目录
  1. Third Normal Form(第三范式)
    1. Student Table
    2. Subject Table
    3. Score Table
  • 怎么消除传递依赖?
    1. The new Score Table
    2. The new Exam table
  • Third Normal Form(第三范式)

    如果一个relation满足第三范式,那么它:

    • 满足第二范式
    • 不存在transitive dependency(传递依赖)


      在前面将第二范式的时候,我们建了3张表,回顾一下。

      Student Table

      student_idnamereg_nobranchaddress
      10Akon07-WYCSEKerala
      11Akon08-WYITGujarat
      12Bkon09-WYITRajasthan

      Subject Table

      subject_idsubject_nameteacher
      1JavaJava Teacher
      2C++C++ Teacher
      3PhpPhp Teacher

      Score Table

      score_idstudent_idsubject_idmarks
      110170
      210275
      311180
      现在我想在Score表里面多加一点信息,说明一下,原来Score表中的marks我们看作是平时成绩,现在附加上`exam_name`和`total_marks`两个字段。
      score_idstudent_idsubject_idmarksexam_nametotal_marks

    修改后,exam_name字段还是依赖于主键(student_id,subject_id)的,毕竟不同专业的学生会有不一样的考试,相同专业的不同考生也有不一样的考试嘛。

    可是total_mark就不太一样了。因为不同考试的算分策略不一样,有的是平时成绩和考试成绩三七开,有的四六开,所以total_marks是取决于exam_name的,但是这张表的主键又是(student_id,subject_id),这样transitive dependency(传递依赖)的定义也就来了:

    Transitive Dependency: When a non-key attribute depends on other non-key attributes rather than depending upon the key attributes or primary key.

    也就是说,一个非码的属性依赖于另一个(或几个)非码属性,这样的依赖就成为传递依赖。也就如Score表中的total_marks是取决于exam_name的,而主码是(student_id,subject_id)


    怎么消除传递依赖?

    把传递依赖的那几列单独放到另一张表去,再设置一个新的列来代替Score表中关于考试的信息。

    The new Score Table

    score_idstudent_idsubject_idmarksexam_id

    The new Exam table

    exam_idexam_nametotal_marks
    1Workshop200
    2Mains70
    3Practicals30