优化设计
数据库设计
数据库设计是一个软件项目成功的基石 。数据库设计也是门学问 。
在项目早期由开发者进行数据库设计(后期调优需要DBA ) 。一 个精通OOP 和ORM 的开发者,设计的数据库往往更为合理,更能适应需求的 变化。因为 数据库的规范化,与OO 的部分思想雷同(如内聚)。而DBA ,设计的数据库的优势是能将DBMS 的能力发挥到极致,能够使用SQL 和DBMS 实现很多程序实现的逻辑,与开发者相比,DBA 优化过的数据库更为高效和稳定 。
数据库设计与程序设计的差异
数据库设计早期优化
不要把它仅仅当成一个存储的功能
1 、关系明确
2 、节省空间
3、提高效率
设计原则
数据库种类
数据库特点
效率与空间
文件系统和数据库系统之间的区别。
(1)文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据;
(2)文件系统中的程序和数据有一定的联系,数据库系统中的程序和数据分离;
(3)文件系统用操作系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据;
(4)文件系统实现以文件为单位的数据共享,数据库系统实现以记录和字段为单位的数据共享。
文件系统和数据库系统之间的联系:
(1)均为数据组织的管理技术;
(2)均由数据管理软件管理数据,程序与数据之间用存取方法进行转换;
(3)数据库系统是在文件系统的基础上发展而来的。
优化设计第一步
精通数据类型
优化设计第二步
范式1NF,2NF,3NF
1NF: 列不可分。每一列都是不可分割的基本数据项
2NF:1NF的基础上面,非主属性完全依赖于主关键字
3NF:属性不依赖于其它非主属性 , 消除传递依赖
BCNF :符合3NF ,每个表中只有一个候选键
4NF:没有多值依赖
优化设计第三步
认知
1、选择小的数据类型
2、单独设计主键,并考虑分布式扩展
3、外键设计
4、索引设计
5、关联关系表设计,多对一,多对多
6、读写频繁的信息,与不频繁的信息分开
7、配置表,日志表,定时任务表等
8、汇总表设计
优化设计第四步
套路
1、通用型设计
例:人员,部门,角色
2、特别设计
附件,日志,配置,监控等
3、存储设计
类型划分便于分区
4、一些附加字段
创建日期,修改日期,排序
5、流水表
类似于日志,但由业务处理结果组成,帐户变动或业务处理的中间值
Codd的RDBMS12法则
Edgar Frank Codd(埃德加·弗兰克·科德)被誉为“关系数据库之父”,并因为在数据库管理系统的理论和实践方面的杰出贡献于1981年获图灵奖。在1985年,Codd 博士发布了12条规则,这些规则简明的定义出一个关系型数据库的理念,它们被作为所有关系数据库系统的设计指导性方针。
1. 信息法则 关系数据库中的所有信息都用唯一的一种方式表示——表中的值。
2. 保证访问法则 依靠表名、主键值和列名的组合,保证能访问每个数据项。
3. 空值的系统化处理 支持空值(NULL),以系统化的方式处理空值,空值不依赖于数据类型。
4. 基于关系模型的动态联机目录 数据库的描述应该是自描述的,在逻辑级别上和普通数据采用同样的表示方式,即数据库必须含有描述该数据库结构的系统表或者数据库描述信息应该包含在用户可以访问的表中。
5. 统一的数据子语言法则 一个关系数据库系统可以支持几种语言和多种终端使用方式,但必须至少有一种语言,它的语句能够一某种定义良好的语法表示为字符串,并能全面地支持以下所有规则:数据定义、视图定义、数据操作、约束、授权以及事务。(这种语言就是SQL)
6. 视图更新法则 所有理论上可以更新的视图也可以由系统更新。
7. 高级的插入、更新和删除操作 把一个基础关系或派生关系作为单个操作对象处理的能力不仅适应于数据的检索,还适用于数据的插入、修
改个删除,即在插入、修改和删除操作中数据行被视作集合。
8. 数据的物理独立性 不管数据库的数据在存储表示或访问方式上怎么变化,应用程序和终端活动都保持着逻辑上的不变性。
9. 数据的逻辑独立性 当对表做了理论上不会损害信息的改变时,应用程序和终端活动都会保持逻辑上的不变性。
10. 数据完整性的独立性 专用于某个关系型数据库的完整性约束必须可以用关系数据库子语言定义,而且可以存储在数据目录中,而非程序中。
11. 分布独立性 不管数据在物理是否分布式存储,或者任何时候改变分布策略,RDBMS的数据操纵子语言必须能使应用程序和终端活动保持逻辑上的不变性。
12. 非破坏性法则 如果一个关系数据库系统支持某种低级(一次处理单个记录)语言,那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整性法则或约束,即用户不能以任何方式违反数据库的约束。
落实这些原则
(一)降低对数据库功能的依赖
(二)定义实体关系的原则
牵涉到的实体 识别出关系所涉及的所有实体。
所有权 考虑一个实体“拥有”另一个实体的情况。
基数 考量一个实体的实例和另一个实体实例关联的数量。
(三)列意味着唯一的
值如果表示坐标(0,0),应该使用两列表示,而不是将“0,0”放在1个列中。
(四)列的 顺序,可读性问题
(五)定义主键和外键
数据表必须定义主键和外键(如果有外键)。
(六)选择键
(七)是否允许NULL
任何值和NULL拼接后都为NULL。所有与NULL进行的数学操作都返回NULL。引入NULL后,逻辑不易处理。
(八)规范化—— 范式
1NF
包含 分隔符类字符的字符串数据。
名字尾端有数字的属性。
没有定义键或键定义不好的表。
2NF
多个属性有同样的前缀。
重复的数据组。
汇总的数据,所引用的数据在一个完全不同的实体中 。
BCNF- “ 每个键必须唯一标识实体,每个非键熟悉必须描述实体。 ”
4NF
三元关系(实体: 实体: 实体)。
潜伏的多值属性。(如多个手机号。)
临时数据或历史值。(需要将历史数据的主体提出,否则将存在大量冗余。)
(九)选择 数据类型
(十)优化 并行
设计DB时就应该考虑到对并行进行优化,比如,timestamp类型。
命名规则
表名规则
1 、要用前缀,但不要用无意义的前缀
2 、下划线分隔
3 、全小写
列名规则
1 、一般不用前缀
2 、下划线分隔