什么是数据库设计?
简单来讲,数据库设计就是根据业务系统的具体须要,结合咱们所选用的数据库管理系统,为这个系统构造出最优的数据存储模型。并创建好数据库中的表结构及表与表之间的关联关系的过程。使之能有效的对应用系统中的数据进行存储,并能够高效对已经存储的数据进行访问。
经常使用的有关系型数据库有:mysql、sqlserver、oracle、pgsql
nosql:redis、mangodb、等等mysql
为何要进行数据库设计?
数据存储,高效访问redis
优良的设计:
减小数据冗余、避免数据维护异常、节约存储空间、高效访问sql
糟糕的设计:
存在大量冗余、存在数据插入、更新、删除异常、浪费大量存储空间、访问数据低效数据库
为何要进行数据库设计?
需求分析 - 逻辑设计 - 物理设计 - 维护优化oracle
数据库需求的做用点:nosql
逻辑设计:
使用er图对数据库进行逻辑建模数据库设计
物理设计:
根据数据库的自身特色将逻辑模型转换为物理模型函数
维护优化:工具
为何要进行需求分析?
1. 了解系统中所要存储的数据
2. 了解数据的存储特色:时效性,不具备时效性(过时、清理、归档)
3. 了解数据的生命周期:快,数据量很大,但不是核心数据
4. 日志不适合存在数据库中。可是必定要存的话,要提早定义好清理和归档规则。随着上线进行归档和清理。sqlserver
需求分析最好是在头脑风暴中进行碰撞而后肯定下来的东西。
需求分析主要讨论目标
将需求转换为数据库的逻辑模型
经过ER图的形式对逻辑模型进行展现
通所选用的数据库不要紧
名词解释:
关系:一个关系对应一般所说的一张表
元组:表中的一行即为一个元组
属性:一列就是一个属性
候选码:表中的某个属性组
主码:一个关系中有多个候选码,选定其中一个作为主码
域: 属性的取值范围【男,女】
份量:元组中的一个属性值,男和女
矩形:表示实体集,矩形内写实体集的名字
菱形:表示联系集(将原先多对多的关系,转换为一对多的关系)
椭圆:表示实体的属性,加下标的就是主键
线段:将属性链接到实体集,或将实体集链接到联系集
操做异常:
插入异常:若是实体随着另外一个实体的存在而存在,既缺乏某个实体时没法表示这个实体,这个表就存在插入异常
更新异常:若是更改表所对应的某个实体实例的单独属性时,须要将多行进行更新,那么久说这个表存在更新异常
删除异常:若是删除表的某一行来反映实例失效时致使拎一个不一样实例信息丢失,那么这个表中就存在删除异常
数据冗余:相同的数据在多个地方存在,或者说表中的某个列可以由其余列计算获得,这样就存在数据冗余
数据库设计通常遵循的范式:第一范式、第二范式、第三范式、Dc范式、反范式设计、第四范式和第五范式通常不涉及。
插入异常、删除异常、更新异常、数据冗余(通常设计,是在反范式设计中为了提升性能,以及查询的方便程度来确认的)
通常互联网应用查询和更新的比例是4笔1或者3比1
全部字段都是单一属性,不可再分,这个单一属性是由基本的数据类型所构成的
定义:数据库中表不存在非关键字对于候选关键字的部分函数依赖
对于单主键必定符合第二范式
不存在非关键字段对任意候选字段的传递函数依赖则符合第三范式
第一第二第三范式都是实体设计不合理,冗余数据,传递主键依赖,致使插入修改删除的异常。
表中若是不存在任何字段对任一候选关键字段的传递函数依赖,则符合bc范式。
候选关键字的传递函数依赖。a 决定b b 决定a 可是都是候选关键字。
设计的时候最好都是单关键字的表,组合主键的最好少创建。
通常如今都是默认innodb,支持事务、行级表锁定,ndb cluster(是内存形式的,通常都不用)
archive使用场景适合日志
表及字段的命名规范:
生日:char、varchar、日期时间、Int时间戳
字段选择原则:优先选择数字类型、再次选择date类型、其次是char、最后才是varchar
以上选择原则:
同类型:占用空间小的。整形优先
char仍是varchar来存储?
decimal与float如何选择
时间类型如何存储
如何选择主键
为了性能和读取效率对于第三范式进行违反,容许少许的数据冗余,提升读取效率。换句话说就是以空间换时间。
如何维护索引
表结构维护:
为了控制表的宽度,能够进行表的垂直拆分:大表拆分小表(数据量是没有变化的)
必需要有的字段:1. Id、2. 建立时间、3. 修改时间、4. 版本号、5. 逻辑删除标记
对更新比较信任,通常不会出现同时更新的状况
同时读取到旧数据,同时对于数据进行更新
对更新不信任,在进行更新的时候,会将表数据锁住,不容许读取,等到更新完毕后,在放开当前的锁。
可以保证在更新的时候,系统数据都是正确的。
要求改前将数据锁住,别人都不可以读取,将数据进行修改,提交后释放锁,别人才可以读取。