视图
本质:SQL 语句封装
场景:
- 增加
计算列
- 简化
多表查询
安全控制
,仅暴露有限字段- 屏蔽真实表变更,增加程序
逻辑独立性
优点:简化查询
语句,提高逻辑层开发效率
缺点:
- 不利于优化
性能
修改限制
较多- 增加了程序和数据库的
耦合性
,增加了各自的维护成本
存储过程
本质:SQL 语句封装
场景:
统计
汇总复杂事务
- 作为
接口
,屏蔽系统变更
优点:
- 简化调用
- 减少网络数据
传输
,降低延迟 - 无需重复
编译
,提高执行效率 - 复杂逻辑下,利于保证数据
准确性
缺点:
- 不同
数据库迁移
成本高 - 分布式下,
主从同步
成本高 - 增加了
数据库服务器
压力 - 需要专业 DBA 优化和
维护
- 应用程序与数据库高度耦合,不适用于业务
频繁变更
的场景
触发器
本质:由事件触发的存储过程
场景:
- 相关表
自动更新
限制
不合法更新- 数据库
备份
同步
优点:
简化
程序逻辑限制
非法操作
缺点:
- 存储过程的缺点
- 逻辑散布程序和数据库,增加了
问题发现和维护
成本
索引
本质:基于特定字段建立的有序目录
场景:优化高并发查询
优点:
- 极大提高
并发查询
效率
缺点:
- 增加
磁盘
占用 - 降低
新增、修改和删除
效率
外键
本质:指向主表的指针
场景:
- 阻止不合法插入
- 级联更新和删除
优点:
- 保证
参照完整性
- 减少数据冗余
- 反映业务逻辑,有利于系统分析和设计
缺点:
- 减慢
开发效率
- 增加
维护成本
- 增加
数据库服务器
开销
主键
作用:
- 唯一标识行
- 作为可以被外键引用的对象
原则:
业务无关
- 使用单列
- 由计算机自动生成
- 永远不要更新主键
范式
内容:
- 1NF: 列不可分
- 2NF: 满足 1NF 且非主属性
完全依赖
于码 - 3NF: 满足 2NF 且非主属性
直接依赖
于码 - BCNF: 满足 3NF 且
主属性
完全依赖和直接依赖于码
优点:
- 减少数据冗余
- 减少删除异常
- 减少插入异常
- 减少更新异常
缺点:
- 查询涉及大量多表关联
- 不利于索引优化
总结
视图、存储过程和触发器本质上是对 SQL 语句的封装,功能上并非不可替代,虽然能一定程度上提高执行和开发效率,但需专业 DBA 优化维护,一般仅适用于与 业务无关
的单纯数据库操作,又或是政府、金融和大型企业内部系统等用户量稳定、业务复杂但 需求变动较少
的行业和场景。
而在 分布式
、高并发
场景下,数据库 IO
往往成为性能瓶颈,通常减少或 不使用外键
,不完全遵从范式
,通过程序逻辑保证数据一致性和完整性,索引
也成为优化查询的必须手段。
如有问题请在下方留言,文章转载请注明出处,详细交流请加下方群组!请大佬不要屏蔽文中广告,因为它将帮我分担服务器开支,如果能帮忙点击我将万分感谢。