数据库设计mysql
数据库设计是一个软件项目成功的基石 。数据库设计也是门学问 。
在项目早期由开发者进行数据库设计(后期调优须要DBA ) 。一 个精通OOP 和ORM 的开发者,设计的数据库每每更为合理,更能适应需求的 变化。由于 数据库的规范化,与OO 的部分思想雷同(如内聚)。而DBA ,设计的数据库的优点是能将DBMS 的能力发挥到极致,可以使用SQL 和DBMS 实现不少程序实现的逻辑,与开发者相比,DBA 优化过的数据库更为高效和稳定 。sql
数据库设计与程序设计的差别数据库
数据库设计早期优化缓存
不要把它仅仅当成一个存储的功能
1 、关系明确
2 、节省空间
三、提升效率服务器
设计原则网络
数据库种类并发
数据库特色数据库设计
效率与空间分布式
文件系统和数据库系统之间的区别。
(1)文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据;
(2)文件系统中的程序和数据有必定的联系,数据库系统中的程序和数据分离;
(3)文件系统用操做系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据;
(4)文件系统实现以文件为单位的数据共享,数据库系统实现以记录和字段为单位的数据共享。高并发
文件系统和数据库系统之间的联系:
(1)均为数据组织的管理技术;
(2)均由数据管理软件管理数据,程序与数据之间用存取方法进行转换;
(3)数据库系统是在文件系统的基础上发展而来的。
优化设计第一步
精通数据类型
优化设计第二步
范式1NF,2NF,3NF
1NF: 列不可分。每一列都是不可分割的基本数据项
2NF:1NF的基础上面,非主属性彻底依赖于主关键字
3NF:属性不依赖于其它非主属性 , 消除传递依赖
BCNF :符合3NF ,每一个表中只有一个候选键
4NF:没有多值依赖
优化设计第三步
认知
一、选择小的数据类型
二、单独设计主键,并考虑分布式扩展
三、外键设计
四、索引设计
五、关联关系表设计,多对一,多对多
六、读写频繁的信息,与不频繁的信息分开
七、配置表,日志表,定时任务表等
八、汇总表设计
优化设计第四步
套路
一、通用型设计
例:人员,部门,角色
二、特别设计
附件,日志,配置,监控等
三、存储设计
类型划分便于分区
四、一些附加字段
建立日期,修改日期,排序
五、流水表
相似于日志,但由业务处理结果组成,账户变更或业务处理的中间值
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
表内划分层级
表外划分层级
最快检索设计
流程表设计
流程主表
任务子表
业务表关联
反范式
适当冗余
一、借鉴覆盖索引的思路,在表内直接放经常使用的字段
二、提取相关数据,制做汇总表
三、第3NF的违反
四、程序级别的冗余或缓存
五、不要写触发器,不要写存储过程
分表分库
•性能:能轻松面对海量数据和高并发的请求处理,好的分布式数据库能作到90%以上的线性增加能力;
•灵活性、弹性:现代的系统的业务和使用场景变化很快,用户的增加也有不少不肯定因素。弹性扩容就很是重要。分布式数据库自己有Cloud-Ready的特性,能很容以经过添加设备扩容知足需求,而不须要影响开发;
•多中心、多活:这点在大型应用中很常见,分布式数据库就更容易实现这个功能,固然这里涉及到分布式数据库的同步和一致性的能力,这也是判断分布式数据库好坏的一个重要指标。
•读写分离:主从节点都能发挥做用;例如巨杉SequoiaDB数据库,能在一组三副本的复制组上实现OLTP,NoSQL应用,OLAP多种应用场景同时使用。
•低成本:x86服务器,SATA存储(部分能够用SSD),加上较好的网络带宽就能够了。
1.水平分区:基本对1个或多个键的水平哈希,加强数据的并行处理能力来提升性能; 2.垂直分区:和过去的Partition很像,对数据进行有含义的拆分; 3.混合分区:水平分区和垂直分区共同使用。