我有一个关于1普通形式的问题,并将通过一个例子来解释它。
让我们想象一下,我们有一组学生正在研究一组项目,但不一定只有一个,但不止一个(多对多关系)。我们有一个表格,记录学生的信息,一个项目。但我们需要将它们联系在一起。但是,由于1NF表示冗余并且每个元组只有价值,你会怎么做? 这两个字段都是主键
插图1:
student_ID project_ID
1 7
2 7,1
3 4,1,9
4 1,3
5 1
插图2:
student_ID project_ID
1 7
2 1
2 7
3 4
3 1
3 9
4 1
4 3
5 1
图1:我知道如果这是一个表的结果,这将违反1NF,因为每个元组只有一个值。
Ilustration 2:因为它们是主键,所以不允许它们被复制,即使我从student_ID中删除主键,我仍然是多余的。
我该如何解决这个问题?
提前感谢:)
答案 0 :(得分:2)
此表的主键是两个字段的组合。它们必须是唯一的。这两个字段都是各自表的外键,它们在各自的表中是唯一的。
答案 1 :(得分:1)
这里的内容基本上是junction table,您的第二个插图显示了normalize的正确方法。
请注意,与联结表的典型情况一样,表的主键将由列的两个组成。这些列中每个唯一的值组合一起指定了一个独特的学生项目配对。
编辑:在MySQL中,您可以定义此表,例如为:
CREATE TABLE student_projects (
student_id INTEGER NOT NULL,
project_id INTEGER NOT NULL,
PRIMARY KEY (student_id, project_id)
)
要强制实施关系一致性,您可能还需要为每个列添加显式foreign key constraints。