MENU

RDBMS 部分模块的设计和使用原则

2020 年 05 月 12 日 • 阅读: 7170 • 后端

视图

本质:SQL 语句封装

场景:

  • 增加 计算列
  • 简化 多表查询
  • 安全控制,仅暴露有限字段
  • 屏蔽真实表变更,增加程序 逻辑独立性

优点:简化查询 语句,提高逻辑层开发效率

缺点:

  • 不利于优化 性能
  • 修改限制 较多
  • 增加了程序和数据库的 耦合性,增加了各自的 维护成本

存储过程

本质:SQL 语句封装

场景:

  • 统计 汇总
  • 复杂事务
  • 作为 接口,屏蔽系统变更

优点:

  • 简化调用
  • 减少网络数据 传输,降低延迟
  • 无需重复 编译,提高执行效率
  • 复杂逻辑下,利于保证数据 准确性

缺点:

  • 不同 数据库迁移 成本高
  • 分布式下,主从同步 成本高
  • 增加了 数据库服务器 压力
  • 需要专业 DBA 优化和 维护
  • 应用程序与数据库高度耦合,不适用于业务 频繁变更 的场景

触发器

本质:由事件触发的存储过程

场景:

  • 相关表 自动更新
  • 限制 不合法更新
  • 数据库 备份 同步

优点:

  • 简化 程序逻辑
  • 限制 非法操作

缺点:

  • 存储过程的缺点
  • 逻辑散布程序和数据库,增加了 问题发现和维护 成本

索引

本质:基于特定字段建立的有序目录

场景:优化高并发查询

优点:

  • 极大提高 并发查询 效率

缺点:

  • 增加 磁盘 占用
  • 降低 新增、修改和删除 效率

外键

本质:指向主表的指针

场景:

  • 阻止不合法插入
  • 级联更新和删除

优点:

  • 保证 参照完整性
  • 减少数据冗余
  • 反映业务逻辑,有利于系统分析和设计

缺点:

  • 减慢 开发效率
  • 增加 维护成本
  • 增加 数据库服务器 开销

主键

作用:

  • 唯一标识行
  • 作为可以被外键引用的对象

原则:

  • 业务无关
  • 使用单列
  • 由计算机自动生成
  • 永远不要更新主键

范式

内容:

  • 1NF: 列不可分
  • 2NF: 满足 1NF 且非主属性 完全依赖 于码
  • 3NF: 满足 2NF 且非主属性 直接依赖 于码
  • BCNF: 满足 3NF 且 主属性 完全依赖和直接依赖于码

优点:

  • 减少数据冗余
  • 减少删除异常
  • 减少插入异常
  • 减少更新异常

缺点:

  • 查询涉及大量多表关联
  • 不利于索引优化

总结

视图、存储过程和触发器本质上是对 SQL 语句的封装,功能上并非不可替代,虽然能一定程度上提高执行和开发效率,但需专业 DBA 优化维护,一般仅适用于与 业务无关 的单纯数据库操作,又或是政府、金融和大型企业内部系统等用户量稳定、业务复杂但 需求变动较少 的行业和场景。

而在 分布式高并发 场景下,数据库 IO 往往成为性能瓶颈,通常减少或 不使用外键不完全遵从范式,通过程序逻辑保证数据一致性和完整性,索引 也成为优化查询的必须手段。

TG 大佬群 QQ 大佬群

最后编辑于: 2021 年 01 月 29 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

Loading captcha...