gpt4 book ai didi

mysql - 在数据库中创建新主键的最佳选择是什么?

转载 作者:行者123 更新时间:2023-11-30 22:44:13 26 4
gpt4 key购买 nike

假设您与创建的三个表有 N-N 关系。举个例子,你有一张CUSTOMER(id_customer, name)的表,汽车表CAR(id_car, model, num_doors, ...)(id_customer和id_car是它们各自表的主键)。现在您创建表 PURCHASE 以将 CUSTOMER 与 CARS 相关联并创建 FOREIGN KEYS...问题是什么是最佳选择?

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;

注意事项:

  • 此表缺少 AUTO_INCREMENT id -- 给定的 PK 是“自然”PK;没有充分的理由需要代理人。
  • “MEDIUMINT”——这是一个提醒,所有 INT 都应该尽可能小(更小 ⇒ 更快)。当然,此处的声明必须与链接到的表中的定义相匹配。
  • “UNSIGNED”——几乎所有的 INT 都可以声明为非负数
  • “NOT NULL”——嗯,这是真的,不是吗?
  • “InnoDB”——由于 PRIMARY KEY 与 InnoDB 中的数据聚类的方式,比 MyISAM 更有效。
  • "INDEX(y_id, x_id)"-- PRIMARY KEY 使单向有效;这使得另一个方向有效。无需说 UNIQUE;这将是对 INSERT 的额外努力。
  • 在二级索引中,说 justINDEX(y_id) 会起作用,因为它会隐式包含 x_id。但我宁愿更明显地表明我希望有一个“覆盖”索引。

参见 Cookbook on building indexes

关于mysql - 在数据库中创建新主键的最佳选择是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com