如果您在 MySQL 数据库中执行多对多关系,是不是有必要将所有键 id 传输到连接表?

Posted

技术标签:

【中文标题】如果您在 MySQL 数据库中执行多对多关系,是不是有必要将所有键 id 传输到连接表?【英文标题】:If you do a many to many relationship in a MySQL db is it necessary to transfer all of the key id's to the join table?如果您在 MySQL 数据库中执行多对多关系,是否有必要将所有键 id 传输到连接表? 【发布时间】:2012-03-02 08:11:44 【问题描述】:

所以我正在使用 mysql 工作台 5.2,我正在为我的数据库制作 EER 图,当我在一个表之间建立多对多关系时(并且这些表已经与其他表有关系),它会创建一个联结表与您要加入的两个表中的所有其他关系.. 我的问题是:是否有必要拥有所有其他键?你不能只有连接表的主键,然后只有你相关的两个表的 id 吗?还是我忽略了什么?

这是我的数据库的一部分:

-- -----------------------------------------------------
  Table `test`.`storys_has_comments`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `test`.`storys_has_comments` (
    `storys_id` INT NOT NULL ,
    `storys_user_id` INT NOT NULL ,
    `comments_id` INT NOT NULL ,
    PRIMARY KEY (`storys_id`, `storys_user_id`, `comments_id`) ,
    INDEX `fk_storys_has_comments_comments1` (`comments_id` ASC) ,
    INDEX `fk_storys_has_comments_storys1` (`storys_id` ASC, `storys_user_id` ASC) )
 ENGINE = MyISAM;

  -- -----------------------------------------------------
   Table `test`.`storys`
  -- -----------------------------------------------------
 CREATE  TABLE IF NOT EXISTS `test`.`storys` (
     `id` INT NOT NULL ,
     `user_id` INT NOT NULL ,
     `catagories_id` INT NOT NULL ,
     PRIMARY KEY (`id`, `user_id`, `catagories_id`) ,
     INDEX `fk_storys_user` (`user_id` ASC) ,
     INDEX `fk_storys_catagories1` (`catagories_id` ASC) )
  ENGINE = MyISAM;

-- -----------------------------------------------------
 Table `test`.`comments`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `test`.`comments` (
   `id` INT NOT NULL ,
   `body` TINYTEXT NULL ,
   PRIMARY KEY (`id`) )
ENGINE = MyISAM;

所以你可以在故事表中看到它有多个事物的外键,即使它只链接到两个表。

【问题讨论】:

【参考方案1】:

您应该拥有要链接的表的所有主键。

我不确定您选择的主键是否正确。当您有唯一的 id story_id 时,为什么要使用 'user_id' 和 'catagories_id' 作为复合键的一部分?

您是否将外键与主键混淆了?

【讨论】:

我添加了一个我想弄清楚的例子。 编辑以反映问题的变化 感谢您的更新。我不确定我是否遵循。你是说storys_has_cmets表应该把主键改成story_id吗?至于你的第二个问题,我相信我知道区别......这就是我的理解:每个表中只能有一个主键,而主键永远不能有两次相同。外键只是引用数据库中另一个表的主键的一种方式,但它也必须永远不要重复..这是正确的吗? 从上面我建议您的 Stories 表只需要一个主键 story_id。我认为您拥有的其他 id 是外键而不是主键。在这种情况下,我认为您的链接表应该只包含 story_id 和 comment_id。 一个外键值可以在表中重复,这就是它的理由。

以上是关于如果您在 MySQL 数据库中执行多对多关系,是不是有必要将所有键 id 传输到连接表?的主要内容,如果未能解决你的问题,请参考以下文章

MySql 学习三(多对多)

mysql 多对多映射关系的筛选SQL怎么写

多对多关系的联结表是不是应该具有代理主键?

数据库模式中的多对多关系表是不是有正式名称?

为核心数据手动创建多对多关系中的中间表

CoreData 检查多对多关系是不是包含对象