标准化 - 1NF澄清

时间:2013-12-15 03:09:37

标签: mysql sql primary-key database-normalization

我有一个关于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中删除主键,我仍然是多余的。

我该如何解决这个问题?

提前感谢:)

2 个答案:

答案 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