概述
为什么80%的码农都做不了架构师?>>>
优化设计
数据库设计
数据库设计是一个软件项目成功的基石 。数据库设计也是门学问 。
在项目早期由开发者进行数据库设计(后期调优需要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 、下划线分隔
设计案例
键设计
物理主键,好建索引,消除传递依赖
主键类型,普通系统是int 或bigint ,效率问题
Uuid ,容量问题,防碰撞
取消所有的联合主键(课程表中:年级+ 课程名)
索引设计
B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持B-Tree 索引。不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
覆盖索引(Covering Indexes)
聚簇索引(Clustered Indexes)
聚簇索引保证关键字的值相近的元组存储的物理位置也相同(所以字符串类型不宜建立聚簇索引,特别是随机字符串,会使得系统进行大量的移动操作),且一个表只能有一个聚簇索引。因为由存储引擎实现索引,所以,并不是所有的引擎都支持聚簇索引。目前,只有solidDB和InnoDB支持。
非 聚簇 索引
二级索引叶子节点保存的不是指行的物理位置的指针,而是行的主键值。这意味着通过二级索引查找行。InnoDB对主键建立聚簇索引。如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引 。一般来说,DBMS都会以聚簇索引的形式来存储实际的数据,它是其它二级索引的基础
表附加字段设计
常用:
创建时间:create_at
修改时间:update_at
排序:sn
有时用:
说明:desc,remark
备选字段:opts_1,opts_2….
字典表设计
字典表与系统配置表的区别
字典表示例
常用数据的常量化,消费类型,支付类型,物品类型(含层级)
系统配置表示例
各模块功能参数的常量化,key-value
附件表设计
存储位置
类型
用途
使用次数
下载次数
层级结构表设计
父子层级,parent_id
表内划分层级
表外划分层级
最快检索设计
流程表设计
流程主表
任务子表
业务表关联
冗余设计
反范式
适当冗余
1、借鉴覆盖索引的思路,在表内直接放常用的字段
2、提取相关数据,制作汇总表
3、第3NF的违反
4、程序级别的冗余或缓存
5、不要写触发器,不要写存储过程
分表分库
•性能:能轻松面对海量数据和高并发的请求处理,好的分布式数据库能做到90%以上的线性增长能力;
•灵活性、弹性:现代的系统的业务和使用场景变化很快,用户的增长也有很多不确定因素。弹性扩容就非常重要。分布式数据库本身有Cloud-Ready的特性,能很容以通过添加设备扩容满足需求,而不需要影响开发;
•多中心、多活:这点在大型应用中很常见,分布式数据库就更容易实现这个功能,当然这里涉及到分布式数据库的同步和一致性的能力,这也是判断分布式数据库好坏的一个重要指标。
•读写分离:主从节点都能发挥作用;例如巨杉SequoiaDB数据库,能在一组三副本的复制组上实现OLTP,NoSQL应用,OLAP多种应用场景同时使用。
•低成本:x86服务器,SATA存储(部分可以用SSD),加上较好的网络带宽就可以了。
1.水平分区:基本对1个或多个键的水平哈希,增强数据的并行处理能力来提高性能;
2.垂直分区:和过去的Partition很像,对数据进行有含义的拆分;
3.混合分区:水平分区和垂直分区共同使用。
转载于:https://my.oschina.net/u/3728166/blog/2998461
最后
以上就是温婉蜜蜂为你收集整理的性能优化(数据库设计原则)优化设计设计案例冗余设计的全部内容,希望文章能够帮你解决性能优化(数据库设计原则)优化设计设计案例冗余设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复