何时使用自动增量键?

时间:2019-03-05 12:24:32

标签: mysql

我最近开始使用MySQL,虽然我已经阅读了一些有关数据库结构的文档,但我无法理解自动增量键以及为什么要使用它们。

有人告诉我:

  • 最好用数字代替文本作为主键,
  • 最好使用没有任何业务含义的键

让我们看一下下面的情况:

 tStores        tSales         tCustomers
----------    -----------    --------------
store_id       sale_id        customer_id
storeCode      store_id
               customer_id

首先,我在tStores中加载了一些可以销售所有商店产品的数据。在我们的业务中,所有商店都有4个字母的代码来标识它们。我可以将其用作主键,但是根据以上建议,我应该使用自动递增的store_id字段吗?

问题是,每次我在tSales中插入内容时,我都必须回到tStores并执行类似的操作:

SELECT store_id from tStores WHERE storeCode = @myStoreCode;

假设我正在为每个商店在tSales中加载成千上万的行,那么使用storeCode作为主键会不会更有效? 解决这个问题的最有效方法是什么?

1 个答案:

答案 0 :(得分:2)

是的,您可以使用storeCode作为主键,如果可以确保它是唯一的,它将可以使用。然后,您将在其他表上添加外键以建立关系。

自动增量索引的好处是:

  • 通常比其他列类型上的任何索引都要快
  • 通常由某些框架(例如PHP中的Laravel)推荐

关于您的结构,我将对以下几点进行评论:

  • 您有混合的套管柱/表。在MySQL上工作时,尤其是在不同的OS(Windows / Linux)上使用时,我总是建议对模式,表和列都使用小写名称。
  • 您在store_idstore_code前面添加了前缀。此前缀不是必需的。为什么不简单地命名列idcode
  • tSales上的关系应命名为tStores_id,以便清楚地指出要引用的表和列。

以下是此示例的SQL代码:

CREATE SCHEMA `myshop` ;

CREATE TABLE `store`.`stores` (
  `code` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`code`));

CREATE TABLE `store`.`sales` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `store_code` VARCHAR(10) NOT NULL,
  `customer_id` INT NOT NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `store`.`customers` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`));

ALTER TABLE `store`.`sales` 
ADD INDEX `fk_sales_customers_id_idx` (`customer_id` ASC) VISIBLE;

ALTER TABLE `store`.`sales` 
ADD CONSTRAINT `fk_sales_customers_id`
  FOREIGN KEY (`customer_id`)
  REFERENCES `store`.`customers` (`id`)
  ON DELETE CASCADE
  ON UPDATE CASCADE;

ALTER TABLE `store`.`sales` 
ADD INDEX `fk_sales_stores_code_idx` (`store_code` ASC) VISIBLE;

ALTER TABLE `store`.`sales` 
ADD CONSTRAINT `fk_sales_stores_code_id`
  FOREIGN KEY (`store_code`)
  REFERENCES `store`.`stores` (`code`)
  ON DELETE CASCADE
  ON UPDATE CASCADE;