为什么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

性能优化(数据库设计原则)相关推荐

  1. 数据库设计原则和优化

    数据库设计原则: 1. 原始单据与实体之间的关系  可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.  在特殊情况下,它们可能是一对多或多对一 ...

  2. 数据库-优化-MYSQL数据库设计原则

    MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大sq ...

  3. 性能优化指南:性能优化的一般性原则与方法

    作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应用还是分布式系统.本文从以下几个方面来思考这个问题:性能优化的一般性原则,性能优化的层次,性能优化的 ...

  4. mysql数据库设计的原则_MySQL数据库设计原则

    转自 http://www.supidea.com/post/mysql_design_database.aspx MySQL数据库设计原则 MySQL对于成为一个非常快速的数据库服务器有着当之无愧的 ...

  5. MYSQL数据库设计原则

    一.MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大 ...

  6. Java虚拟机学习总结(2)——性能优化的一般性原则、层次与通用方法

    一.性能优化的一般性原则 (1).依据数据而不是凭空猜测 性能优化的第一原则是当我们怀疑性能有问题的时候,应该通过测试.日志.profillig来分析出哪里有问题,有的放矢,而不是凭感觉.撞运气.一个 ...

  7. 数据库设计原则与开发规范,你知道多少?

    VOL 187 21 2020-12 今天距2021年11天 这是ITester软件测试小栈第187次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周早上 08:30准 ...

  8. 数据库设计(二)——数据库设计原则

    一.数据库表的设计原则 1.不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间所对应的数据库表之间的关联应尽可能减少,如果不 ...

  9. 性能优化的一般性原则和方法​​​​​​​

    看了一篇详细介绍性能优化的博文,感觉很不错,特转载自此.原文地址:性能优化的一般性原则和方法 正文 作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应 ...

  10. 数据库设计基本步骤 / 数据库设计原则

    基本步骤         按照规范设计的方法,同时考虑数据库及其应用系统开发的全过程,可以将数据库设计分为以下 6 个阶段: 需求分析阶段 需求分析是数据库设计的第一步,也是整个设计过程的基础,本阶段 ...

最新文章

  1. C# Lambda表达式
  2. SEH反调试(SetUnhandledExceptionFilter)
  3. leetcode 636. Exclusive Time of Functions | 636. 函数的独占时间(Stack)
  4. Linux Shell脚本入门教程系列之(五)Shell字符串
  5. 网站并发300就很慢
  6. 电商业务设计:社交电商产品核心设计
  7. cs231n学习笔记 CNN 目标检测 定位 分割
  8. 第六章第三十一题(金融应用:信用卡号的合法性验证)(Financial: credit card number validation)
  9. 什么是域名备案?为什么要进行备案?备案后你将会获得下列益处
  10. 输入汉语星期几输出英文c语言程序,c输入1234567,输出英语星期日期
  11. 谷歌浏览器翻译插件的安装与使用
  12. 谈古论津丨天津杨柳青年画为何要用娃娃作主题?
  13. 高翔orbslam_高翔Slambook第七讲代码解读(特征点提取)
  14. 1995-2020年国泰安并购重组数据库
  15. 什么是SQL触发器?SQL触发器是什么意思?
  16. gzip 压缩解压代码示例
  17. Linux安装GaussDB数据库图文,GaussDB 100 on Linux安装手册
  18. 可计算性、可判定性和可满足性
  19. 【大数据】《红楼梦》作者分析(QDU)
  20. k8s创建用户账号——User Account

热门文章

  1. linux下模仿用户左键,linux 鼠标左右键互换实现代码
  2. php面向接口编程思想,面向接口编程 - Laravel 实践
  3. 服务器放n个网站,服务器放n个网站
  4. python列表索引负数_python – 如何检查列表索引是否存在?
  5. JAVA 虚拟机 (SE 7)【待更】
  6. python3之MongoDB
  7. 南阳师范学院ACM集训队博客使用方法
  8. 《Delphi XE6 android 编程入门教程》推荐
  9. 使用dynDNS+openSSH+putty突破公司防火墙
  10. C#中发送消息给指定的窗口到消息循环