上一篇
上周公司新来的实习生小张兴冲冲地跑来找我:"哥!我设计的电商数据库出问题了!用户能把同一个商品重复加入购物车100次,现在计算总价直接爆炸了💥..."
我看了眼他的数据表设计,果然——没有正确定义主码(Primary Key)和外码(Foreign Key),这就像建房子没打地基,数据混乱只是时间问题⏳。
主码就像每个人的身份证号,是唯一标识表中每行数据的列或列组合,比如用户表中的用户ID,订单表中的订单编号。
-- 好的主码设置示例 ✅ CREATE TABLE users ( user_id INT PRIMARY KEY AUTO_INCREMENT, -- 自增整数做主码 username VARCHAR(50) NOT NULL UNIQUE -- 用户名虽然唯一但不是主码 ); -- 危险示范 ❌ CREATE TABLE products ( product_name VARCHAR(100) PRIMARY KEY, -- 字符串做主码可能重复 price DECIMAL(10,2) );
有些表需要多个列组合才能唯一标识:
CREATE TABLE course_registration ( student_id INT, course_id INT, semester VARCHAR(20), PRIMARY KEY (student_id, course_id, semester) -- 三列组合做主码 );
外码是一个表中的字段,它指向另一个表的主码,建立表间关系,就像订单表中的"用户ID"指向用户表的主码。
CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, order_date DATETIME, FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE -- 用户删除时自动删除其所有订单 );
动作类型 | 效果说明 | 适用场景 |
---|---|---|
NO ACTION | 阻止破坏参照完整性的操作(默认) | 需要严格保护的关联数据 |
CASCADE | 主表删除/更新时从表同步操作 | 订单-订单明细等强关联 |
SET NULL | 主表操作时将外码设为NULL | 可选关联的非核心数据 |
SET DEFAULT | 外码恢复为默认值 | 有明确默认值的分类数据 |
特性 | 主码 | 外码 |
---|---|---|
唯一性 | 必须唯一 | 可以重复 |
空值 | 不允许NULL | 根据业务允许NULL |
数量 | 每表只能有一个 | 每表可以有多个 |
创建目的 | 唯一标识记录 | 建立表间关系 |
索引 | 自动创建唯一索引 | 建议手动创建索引 |
-- 可能的问题:分库分表时ID冲突 CREATE TABLE logs ( id INT AUTO_INCREMENT PRIMARY KEY, -- 多台服务器可能生成相同ID content TEXT ); -- 改进方案:使用UUID或雪花算法 CREATE TABLE distributed_logs ( id CHAR(36) PRIMARY KEY DEFAULT UUID(), -- 全局唯一 content TEXT );
-- 忘记给外码加索引会导致联表查询变慢 ALTER TABLE orders ADD INDEX idx_user_id (user_id); -- 补救措施
-- 表A引用表B,表B又引用表A → 形成死结 CREATE TABLE departments ( dept_id INT PRIMARY KEY, manager_id INT REFERENCES employees(emp_id) ); CREATE TABLE employees ( emp_id INT PRIMARY KEY, dept_id INT REFERENCES departments(dept_id) ); -- 解决方案:允许一方为NULL或使用中间表
好的数据库设计就像乐高积木🎯——主码是每个积木的独特凸点,外码是确保它们严丝合缝连接的凹槽,下次设计表结构时,不妨先画个ER图✏️,理清关系再动手,能省去80%的后期麻烦!
(本文基于2025年8月最新数据库设计实践整理)
本文由 闽璞 于2025-08-02发表在【云服务器提供商】,文中图片由(闽璞)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/513118.html
发表评论