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

时间:2015-05-08 17:06:32

标签: mysql database optimization

想象一下你创建了三个表的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,考虑到数据库中的效率和优化。

1 个答案:

答案 0 :(得分:0)

对于多对多映射,请按照这种方式进行。

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