首页 > 解决方案 > 我应该使用自动增量 ID 还是唯一键作为外键?

问题描述

我对良好的关系数据库设计有一些疑问。给定下面的简单 MySQL 数据库架构和 Nodejs Express 服务器。truck对于给定特定数据的获取请求customer_key

  1. 使用 thecustomer_id或 thecustomer_key作为truck表的外键更好吗?
  2. 可以customer_keycustomer_id吗?(由于某种原因,自动递增的值是否特别有用?)
  3. 如果两者customer_keycustomer_id保留,那么返回数据的最佳方式是什么。(有比这更好的东西SELECT * FROM truck WHERE customer_id = (SELECT customer_id FROM customer WHERE customer_key = 'cust123');吗?)

表架构

CREATE TABLE customer (
  customer_id INT NOT NULL AUTO_INCREMENT,
  customer_key VARCHAR(100) NOT NULL UNIQUE,
  first_name VARCHAR(100) NOT NULL,
  last_name VARCHAR(100) DEFAULT NULL,
  email VARCHAR(150) NOT NULL UNIQUE,
  date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (customer_id),
  UNIQUE KEY (customer_key)
);

CREATE TABLE truck (
  truck_id INT NOT NULL AUTO_INCREMENT,
  truck_key VARCHAR(100) NOT NULL UNIQUE,
  customer_id INT NOT NULL, # should this be customer_key
  truck_type VARCHAR(100) NOT NULL,
  date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (truck_id),
  UNIQUE KEY (truck_key),
  FOREIGN KEY (customer_id) # should this be customer_key
   REFERENCES customer(customer_id) # should this be customer_key
);

标签: mysqlnode.jsexpress

解决方案


为了更有效的存储,我会使用自动增量 id。尽管如果您的唯一键要短得多,我会说您应该将其用作主键(显然也是外键)并完全放弃 id 。使用 100 个字符的唯一键,我可以看到拥有单独 id 的一些意义。

对于您的第三个问题,我更喜欢加入子查询:

select truck.*
from customer
join truck using (customer_id)
where customer_key = 'cust123';

虽然理想情况下,如果您要使用整数主键,您可以从您拥有的任何 UI 中获得它,而不是 customer_key。从您的示例中,我确实质疑您是否根本需要 varchar 键;它们实际上代表了您模型之外的东西吗?


推荐阅读