Mysql 什么';在数据库中创建新主键的最佳选择是什么?

Mysql 什么';在数据库中创建新主键的最佳选择是什么?,mysql,database,optimization,Mysql,Database,Optimization,假设您有一个N-N关系,创建了三个表。例如,图像中有一个用于CUSTOMER(id\u CUSTOMER,name)、car表car(id\u car,model,num\u doors,…)(id\u CUSTOMER和id\u car是各自表的主键)。 现在,您可以创建PURCHASE表,将CUSTOMER与汽车关联起来,并创建外键。。。问题是什么是最好的选择 1.PURCHASE(id_customer, id_car, date_purchase) -> Primary keys

假设您有一个N-N关系,创建了三个表。例如,图像中有一个用于
CUSTOMER(id\u CUSTOMER,name)
、car表
car(id\u car,model,num\u doors,…)
(id\u CUSTOMER和id\u car是各自表的主键)。 现在,您可以创建PURCHASE表,将CUSTOMER与汽车关联起来,并创建外键。。。问题是什么是最好的选择

1.PURCHASE(id_customer, id_car, date_purchase) -> Primary keys are (id_customer, id_car). Foreign keys are (id_customer->CUSTOMER.id_customer and id_car->CAR.id_car).
2.PURCHASE(id, id_customer, id_car, date_purchase) -> Primary keys are (id), Foreign keys are (id_customer->CUSTOMER.id_customer and id_car->CAR.id_car).

我的问题是,考虑到数据库的效率和优化,最好的选择是1还是2。

对于多对多映射,请这样做

CREATE TABLE XtoY (
    # No surrogate id for this table
    x_id MEDIUMINT UNSIGNED NOT NULL,   -- For JOINing to one table
    y_id MEDIUMINT UNSIGNED NOT NULL,   -- For JOINing to the other table
    # Include other fields specific to the 'relation'
    PRIMARY KEY(x_id, y_id),            -- When starting with X
    INDEX      (y_id, x_id)             -- When starting with Y
) ENGINE=InnoDB;
注:

  • 此表缺少自动增量id——给定的主键是“自然”主键;没有充分的理由去做代理
  • “MEDIUMINT”--这是一个提醒,所有INT都应该尽可能小(更小)⇒ 更快)。当然,这里的声明必须与链接到的表中的定义相匹配
  • “UNSIGNED”--几乎所有整数都可以声明为非负
  • “不是空的”——嗯,这是真的,不是吗
  • “InnoDB”--比MyISAM更有效,因为主键与InnoDB中的数据聚集在一起的方式
  • “索引(y_id,x_id)”——主键使它能够高效地向一个方向移动;这使另一个方向更有效率。不需要说独特;这将是额外的努力插入
  • 在二级索引中,说justINDEX(y_id)会起作用,因为它会隐式地包含x_id。但我更愿意让它更明显,我希望有一个“覆盖”索引

请参见

从用例的角度来看,用户可能会购买一辆汽车,然后出售,然后再购买。因此,在边缘案例中,1似乎会引起问题。问题的意义不是买车的概念。这就是一个例子。问题的意思是什么更好,为中间关系表创建一个主键,或者使用两个foring键作为主键。我想你没有理解我问题的意思。我是创建表的专家,我的问题与效率和优化有关,而不是关于语法或数据库理解的问题。请仔细阅读后再回答我。谢谢我推荐的两个索引为您提供了最佳性能。添加
外键
(任何地方)都会减慢速度。嗨,瑞克,好吧,我知道了,但是下一个解决方案呢?在您给我的解决方案中,添加一个ID INT UNSIGNED NOT NULL AUTO,索引y_ID,x_ID),主键是我刚才添加的ID。然后,您可以在其他表中引用此索引,而不需要创建2个索引以在其他表中引用它。另一个表可以通过,或仅通过
x\u id
引用此索引。也许我不“理解”;请给我们看一下可能有麻烦的参考资料。我的意思很难解释。但别担心,如果你说两个主键也作为外键更好,别担心,我会给你一些建议。