【问题标题】:normalization - 1NF clarification标准化 - 1NF 澄清
【发布时间】:2013-12-15 03:09:36
【问题描述】:

我有一个关于 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,因为每个元组的值多于一个。

插图 2:由于它们是主键,因此不允许重复,即使我从 student_ID 中删除主键,我仍然是多余的。

我该如何解决这个问题?

提前致谢:)

【问题讨论】:

    标签: mysql sql primary-key database-normalization


    【解决方案1】:

    此表的主键将是两个字段的组合。它们必须一起是唯一的。这两个字段都是各自表的外键,它们在各自的表中是唯一的。

    【讨论】:

      【解决方案2】:

      你这里基本上是一个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

      【讨论】:

      • 好的,所以我将这两个字段都设置为主键,mysql 会明白是它们的组成使它们独一无二?那个方式用图2?
      • 非常感谢您的帮助!
      猜你喜欢
      • 2017-07-24
      • 2014-07-21
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多