【问题标题】:MySQL unique id or combined idMySQL 唯一 id 或组合 id
【发布时间】:2011-11-26 15:34:04
【问题描述】:

我的项目和开发人员计划具有以下结构:

developer table
id
developer name
etc...

project table
id
project name
etc...

developer _project table
???

因为一个开发人员可以在多个项目中,而一个项目可以有多个开发人员,我必须创建一个新表,但从我读到的内容来看,他们没有告诉我应该使用什么 id。

如果我使用 id 自动递增 + user_id + project_id 我会重复因为 id 是主键吗?

【问题讨论】:

    标签: mysql primary-key


    【解决方案1】:

    使用唯一的组合键:

    CREATE TABLE `developer_project` (
     developer_id INT(10) UNSIGNED /* etc... */,
     project_id INT(10) UNSIGNED /* etc... */,
     PRIMARY KEY dev_project (developer_id, project_id)
    );
    

    如果您创建 ID,您可能永远不会使用它,因为您将在 LEFT JOIN 中查询 developer_id 和/或 project_id

    注意:确保列定义与developerproject 表相同。

    【讨论】:

    • 为什么它们需要相同的定义?
    • 假设你有来自开发者表的INT UNSIGNED(最大值4294967295,因为未签名)和tinyint(最大值为127,因为它已签名 - unsigned 字未定义)交集表。因为达到了交集表中的最大数量,它不会插入超过这个数字,它会在 127 处停止(你会得到:Out of range value for column 'developer_id' at row 1)。阅读更多:help.scibit.com/mascon/masconMySQL_Field_Types.html
    【解决方案2】:

    对于多对多关系,您可以简单地使用两个字段的复合主键。

    示例(假设 project_id 和 developer_id 都是整数):

    创建表`developer_project`( `developer_id` INT NOT NULL , `project_id` INT NOT NULL , 主键(`developer_id`,`project_id`) )

    【讨论】:

      【解决方案3】:

      组合表(在 MySQL 工作台中自动称为“developer_has_project”)应使用组合主键(开发者、项目)。如果您向此键 (ID) 添加第三列,则它不再必须是唯一的:

      (id,developer,project)
      (1,1,1)
      (2,1,1)
      (3,1,1)
      

      仅使用开发人员和项目,它就可以工作:

      (developer,project)
      (1,1)
      (1,1) <-- error!
      (2,1)
      

      或者,您可以使用 ID 作为唯一的主键,并在 (developer,project) 上添加 UNIQUE 约束:

      (id,developer,project)
      (1,1,1)
      (2,1,1) <-- error
      (3,2,1)
      

      【讨论】:

        【解决方案4】:

        要么:

        developer_project table
        developer_id
        project_id
        PRIMARY KEY (developer_id, project_id)
        

        developer_project table
        id
        developer_id
        project_id
        PRIMARY KEY (id)
        UNIQUE KEY (developer_id, project_id)
        

        我建议您使用第一个选项,除非您有理由不这样做。有些 ORM 不能很好地处理复合(主)键。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-21
          • 2017-12-23
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-13
          相关资源
          最近更新 更多