数据库中,哪些关系必须使用外键来维护数据一致性?
- 内容介绍
- 文章标签
- 相关推荐
在数据库设计与日常运维中,最常遇到的痛点是数据不一致、冗余和查询性能差。当这些问题出现时往往代表着缺乏有效的约束机制,而外键正是解决这些痛点的关键工具。
使用者痛点回顾
1)数据不一致:业务流程中经常出现无效记录入或关联记录被误删,导致报表统计错误。
2)冗余存储:同一条业务信息在多个表重复保存,浪费存储空间且易出错。
3)查询慢:关联查询频繁扫描全表。没有索引或约束支持,导致性能瓶颈。
4)维护困难:手工同步主表与从表的数据更新成本高,容易出现遗漏。
哪些关系必须使用外键来维护数据一致性?
A. 父子表
-
订单–订单详情
- 痛点:- 删除订单时未删除对应详情导致孤立行;话说回来,解决:- 在详情表设置外键指向订单主键。并开启级联删除或设置为NULL。按理说,
- 示例 SQL:
-
ALTER TABLE order_detail ADD CONSTRAINT fk_order_detail_order_id FOREIGN KEY REFERENCES orders ON DELETE CASCADE;
-
部门–员工
- 痛点:- 员工分配到不存在的部门;解决:- 员工表中部门ID列设为外键引用部门主键。
-
ALTER TABLE employee ADD CONSTRAINT fk_employee_department_id FOREIGN KEY REFERENCES department;
-
文章–评论、帖子–回复等类似结构化内容程序也适用一样规则。
B. 多对多关系
-
学生–课程 → 学生课程
- 痛点:- 学生选择不存在的课程;解决:- 中间表中的两列均设为外键。分别引用学生和课程主键,从而保证选课记录合法。
-
CREATE TABLE student_course ( student_id INT,course_id INT。PRIMARY KEY,FOREIGN KEY REFERENCES student,FOREIGN KEY REFERENCES course );
-
角色–权限 → 使用者角色映射表
- 痛 点 : - 使用者分配了不存在的角色或权限; 解 决 : - 将角色ID 与 权限ID 设置为外 键。
C. 一对一关系
D. 强制参照完整性场景
将成功绕连具: 在任何需要确保关联字段指向存在记录、避免空值或错误引用的业务场景,都应考虑使用外 键。说到例如,支付程序中的订单->支付记录、物流程序中的发货单->仓库信息等。
MOTIVATION & BENEFITS 简述
在数据库设计阶段,如果你正面临以下情况。请务必评估是否需要加入外 键约束:
-
存在父子依赖且需自动级联处理
/ / data-uuid=%s */ class='text-highlight-text'
%d%%%%%$#$@$%%%%$%^$%% $^$%^$%
%d%%%%%$#$@$%%%%$%^$%% $^^$$^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^ ^ ^ ^^ ^^^^^^^^^^^^^ ^^ ^ ^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^* $$ * $$ * $$ * $$ * $$ * $$ * $$ * * * * * * * * ** * * * * * * * * * *
%d %% %% $ "$ '' ','','','',' ' ' ' ' '' '
在数据库设计与日常运维中,最常遇到的痛点是数据不一致、冗余和查询性能差。当这些问题出现时往往代表着缺乏有效的约束机制,而外键正是解决这些痛点的关键工具。
使用者痛点回顾
1)数据不一致:业务流程中经常出现无效记录入或关联记录被误删,导致报表统计错误。
2)冗余存储:同一条业务信息在多个表重复保存,浪费存储空间且易出错。
3)查询慢:关联查询频繁扫描全表。没有索引或约束支持,导致性能瓶颈。
4)维护困难:手工同步主表与从表的数据更新成本高,容易出现遗漏。
哪些关系必须使用外键来维护数据一致性?
A. 父子表
-
订单–订单详情
- 痛点:- 删除订单时未删除对应详情导致孤立行;话说回来,解决:- 在详情表设置外键指向订单主键。并开启级联删除或设置为NULL。按理说,
- 示例 SQL:
-
ALTER TABLE order_detail ADD CONSTRAINT fk_order_detail_order_id FOREIGN KEY REFERENCES orders ON DELETE CASCADE;
-
部门–员工
- 痛点:- 员工分配到不存在的部门;解决:- 员工表中部门ID列设为外键引用部门主键。
-
ALTER TABLE employee ADD CONSTRAINT fk_employee_department_id FOREIGN KEY REFERENCES department;
-
文章–评论、帖子–回复等类似结构化内容程序也适用一样规则。
B. 多对多关系
-
学生–课程 → 学生课程
- 痛点:- 学生选择不存在的课程;解决:- 中间表中的两列均设为外键。分别引用学生和课程主键,从而保证选课记录合法。
-
CREATE TABLE student_course ( student_id INT,course_id INT。PRIMARY KEY,FOREIGN KEY REFERENCES student,FOREIGN KEY REFERENCES course );
-
角色–权限 → 使用者角色映射表
- 痛 点 : - 使用者分配了不存在的角色或权限; 解 决 : - 将角色ID 与 权限ID 设置为外 键。
C. 一对一关系
D. 强制参照完整性场景
将成功绕连具: 在任何需要确保关联字段指向存在记录、避免空值或错误引用的业务场景,都应考虑使用外 键。说到例如,支付程序中的订单->支付记录、物流程序中的发货单->仓库信息等。
MOTIVATION & BENEFITS 简述
在数据库设计阶段,如果你正面临以下情况。请务必评估是否需要加入外 键约束:
-
存在父子依赖且需自动级联处理
/ / data-uuid=%s */ class='text-highlight-text'
%d%%%%%$#$@$%%%%$%^$%% $^$%^$%
%d%%%%%$#$@$%%%%$%^$%% $^^$$^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^ ^ ^ ^^ ^^^^^^^^^^^^^ ^^ ^ ^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^* $$ * $$ * $$ * $$ * $$ * $$ * $$ * * * * * * * * ** * * * * * * * * * *
%d %% %% $ "$ '' ','','','',' ' ' ' ' '' '

