mysql - 我应该使用自动增量 ID 还是唯一键作为外键?
问题描述
我对良好的关系数据库设计有一些疑问。给定下面的简单 MySQL 数据库架构和 Nodejs Express 服务器。truck
对于给定特定数据的获取请求customer_key
。
- 使用 the
customer_id
或 thecustomer_key
作为truck
表的外键更好吗? - 可以
customer_key
换customer_id
吗?(由于某种原因,自动递增的值是否特别有用?) - 如果两者
customer_key
都customer_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
);
解决方案
为了更有效的存储,我会使用自动增量 id。尽管如果您的唯一键要短得多,我会说您应该将其用作主键(显然也是外键)并完全放弃 id 。使用 100 个字符的唯一键,我可以看到拥有单独 id 的一些意义。
对于您的第三个问题,我更喜欢加入子查询:
select truck.*
from customer
join truck using (customer_id)
where customer_key = 'cust123';
虽然理想情况下,如果您要使用整数主键,您可以从您拥有的任何 UI 中获得它,而不是 customer_key。从您的示例中,我确实质疑您是否根本需要 varchar 键;它们实际上代表了您模型之外的东西吗?
推荐阅读
- shopify - 为什么 Neto/Shopify 使用自己的模板语言?
- wordpress - Git 状态 - 仅列出有更改的直接子文件夹,而不是内部文件
- php - 如何使用 db 中的存储结构恢复 jquery ui 可排序列表
- windows - Delphi 7 可以通过 OLE Variant 传递 Int64 值吗?
- python - Django Server启动后如何自动启动其他服务器
- angular - 动态生成组件(Angular 7)以插入 DOM
- python - Python QTableView | 如何在不按住 Ctrl 的情况下通过单击选择多行?
- jquery - 如何将此 Jquery 代码转换为 React JS?
- sql - 带有多个子查询的 SQL 错误 10249 Hive
- android - Android Studio 3.3 升级后,我的 APK 会构建但不会运行