如何为学生,科目和学生科目表制作第二范式?

时间:2017-08-22 13:20:30

标签: sql normalization database-normalization

我有两个表,其数据如下:

第一张表:

ID NAME   GENDER  AGE
1   test1   M     18
2   test2   F     20
3   test3   M     18

第二张表:

ID SubjectCode
1    PHY1
2    PHY2
3    MATH1

我创建了另一个表,其中2个外键都是上述两个表的主键。它如下:

Student_ID     Subject_ID
1               PHY1
2               MATH1  
1               PHY2
2               PHY2

第三个表是通过从表中插入学生ID而从第二个表中插入主题id来创建的。但正如您所看到的,一个学生可以申请多个科目,这会创建学生ID的冗余。我是SQL的初学者,想要将第三个表转换为第二个普通表。我该怎么做?我应该执行哪些操作来帮助我实现它?

我对2NF感到有些困惑;但是,我不希望我的第三个表中的ID重复。我希望ID保持唯一,并且对应于相同ID的新主题代码将包含在不同的列中。我希望我已经表达了我的意思。你有什么建议来实现它?

2 个答案:

答案 0 :(得分:1)

归一化到更高的NF(正常形式)涉及FD(功能依赖性),但你没有提到任何。你使用含糊不清的术语,如"repeat" & "redundant"。在所有NF下,关系中出现多次相同值的事件。你提到PK(主键),但它们并不重要,CK(候选键)可以。虽然设计涉及多个表格,但是正常化表格与其他表格无关,因此您的第一个表格和第二张表与规范第三张表无关。因此,您似乎很清楚,您不了解绝对的基础知识,而且您需要遵循教科书。

2NF的两个常见定义的措辞是没有任何特定类型的FD,据说是违反"违反"。请注意,您必须知道所有持有的FD。你可以总是以某种方式无损地分解,从而给出较小的组件,其中一个这样的FD不再是问题。这可以合理地模糊地称为"将FD移动到其自己的组件,留下另一个组件"。如果你继续这样做,你将最终拥有所有2NF组件 - 一个2NF设计。

然而,这是将表格分解为2NF的一种不好的方法,因为它可能会不必要地产生比必要更多的表格,从而排除了较高的NF设计以后出现,并且未能保留FDs&#34 ;。使用保留FD的3NF algorithm来获得2NF。无论如何,我们不会通过降低NF来规范化更高的NF。 (这就是2NF不重要的原因。)

PS使用常识期望,您的第三个表具有唯一的CK {Student_ID,Subject_ID}并且是5NF。

答案 1 :(得分:-2)

如果您输入subject_id而不是subject_code详细信息,可能会更好,如下所示:

ID   St_ID     Su_ID
1    1         1
2    2         3
3    1         2

这里Id是第3个表的主键,其他2个是前2个表的外键,

希望第二个表中的ID是主键,你可以做到这一点,而不是没关系