数据库设计
来源:互联网 发布:音乐可视化软件 编辑:程序博客网 时间:2024/04/30 11:07
数据库设计过程
- 需求分析
- 数据是什么
- 数据有哪些属性
- 数据和属性各自的特点是什么
- 逻辑设计
- 通过er图进行逻辑建模
- 物理设计
- 维护优化
- 新的需求进行建表
- 索引优化
- 大表拆分
需求分析
- 了解
- 系统中所要存储的数据
- 数据的存储特点
- 数据的生命周期
- 搞清楚(这个是重点)
- 实体之间的关系(1:1,1:n,m:n)
- 实体所包含的属性
- 哪些属性或属性的组合可以唯一标识一个实体(码)
逻辑设计
- 做什么
- 将需求转化为数据库的逻辑模型
- 通过er图的形式对逻辑模型进行展示
- 同所选用的具体的dbms无关
数据库设计范式
第一范式
数据库表中的所有字段都是单一属性,不可再分的.
单一属性由基本的数据类型构成.
换句话说,第一范式要求数据库中的表都是二维表.第二范式
数据库的表中不存在非关键字段对任意候选关键字段的部分函数依赖.
部分函数依赖是指存在着组合关键字的某一关键字决定非关键字的情况.
换句话说,所有的但关键字段的表都符合第二范式第三范式
第三范式是在第二范式的基础之上定义的,如果数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式.
BC范式(Boyce.Codd范式)
定义在范式的基础之上,数据表中如果存在任意字段对任一候选关键字段的传递函数依赖则符合BC范式.
也就是说,如果是复合关键字,则复合关键字之间不能存在函数依赖关系.
不符合范式要求的表可能存在异常:数据操作(cud)异常及数据冗余,通常的解决方法是通过拆表
物理设计
- 做什么
- 选择DBMS
- 定义数据库,表及字段的命名规范
- 选择字段类型
- 反范式化的设计(如空间换时间等)
- 选择DBMS
- Qracle, SqlServer都是商业数据库,即收费,企业级项目
- Mysql, Pgsql开源数据库,互联网项目
- Mysql常用的存储引擎
- MylSAM,不支持事务,只能用:Select, Insert,忌用:读写操作频繁
- MRG_MYISAM,不支持事务,忌用:全局查找过多
- innodb,支持事务,用的最广泛
- achive,不支持事务,只能用:Select, Insert,忌用:需要随机存取,更新,删除
- Ndb Cluster,支持事务,忌用:大部分应用
- 表及字段的命名规范
- 原则
- 可读性原则.使用大小写格式化表名
- 表意性原则.
- 长名原则.少用缩写
- 原则
- 字段类型选择
- 原则
- 当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型
- 对于相同级别的类型,应该优先选择占用空间小的类型
- 选择
- 通常用varchar代替char
- decimal用于存储精确数据,而float只能用于存储非精确数据,通常用float
- 时间的存储:int, datetime,时间粒度
- 原则
- 其他注意事项
- 如何选择主键
- 区分业务主键和数据库主键
- 根据数据库的类型,考虑之间是否要顺序增长
- 主键的字段类型所占空间尽量小
- 避免使用外键约束
- 减低导入的效率
- 增加维护成本
- 相关联的列上一定要建立外键
- 避免使用触发器
- 降低数据导入的效率
- 发生异常
- 使业务逻辑复杂
- 避免预留字段
- 无法确定的知道预留字段的类型
- 无法准确的知道预留字段中所存储的内容
- 后期维护预留字段的成本,同增加一个字段所需要的成本是相同的
- 如何选择主键
- 反范式化
- 为了性能和读取效率的考虑适当的对第三范式的要求进行违反,允许存在少量的数据冗余,空间换事件
- 优点:减少表的关联数量,提高数据的读取效率
维护和优化
- 做什么
- 维护数据字典
- 维护索引
- 维护表结构
- 在适当时候对表水平拆分或垂直拆分
- 如何维护数据字典
- 使用第三方工具
- 利用数据库本身的备注字段来维护数据字典,如增加备注字段(comment ”),可以到处数据字典
- 如何维护索引
- 出现在where, group by, order by从句中的列
- 索引不要包括太长的数据类型
- 定期维护索引的碎片
- 在sql语句中不要使用强制索引关键字
- 如何维护表结构
- 使用在线表变更表结构的工具
- 同时对数据字典进行维护
- 控制表的宽度和大小
- 表的拆分
- 垂直拆分(列的拆分)
- 经常查询的列放在一起
- text,blob等大字段拆分出到附加表
- 水平拆分
- 主键hash
- 垂直拆分(列的拆分)
0 0
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- 数据库设计
- intent.setFlags方法中的参数值含义
- 欢迎使用CSDN-markdown编辑器
- android listview焦点争端补充(侧滑添加和删除)
- javaweb中常用的验证工具类
- 开源KVM管理平台
- 数据库设计
- session详解
- 机器学习课堂笔记(十八)
- Androin学习笔记二十:findViewById 为null
- Qt自定义样式/无边框窗口/子窗口模态/非模态问题
- 小爱
- STL-水果
- acm 2016/5/18 hpu15级练习 C
- BM25算法的实现过程