我有两个表,其数据如下:
第一张表:
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的新主题代码将包含在不同的列中。我希望我已经表达了我的意思。你有什么建议来实现它?
答案 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
是主键,你可以做到这一点,而不是没关系