8,数据库设计基础
2024-10-17 11:10:38 0 举报
AI智能生成
数据库基础知识
作者其他创作
大纲/内容
关系数据库
基本概念
属性(Attribute):在现实世界中,要描述一个事物常常取若干特征来表示。这些特征称为属性
域(Domain):每个属性的取值范围对应一个值的集合,称为该属性的域
目或度(Degree):目或度指的是一个关系中属性的个数
候选码(Candidate Key):若关系中的某一属性或属性组的值,能唯一地标识一个元组,则称该属性或属性组为候选码
主码(Primary Key):或称主键,若一个关系有多个候选码,则选定其中一个作为主码
主属性(Prime Attribute):包含在任何候选码中的属性称为主属性
外码(Foreign Key):如果关系模式 R 中的属性或属性组不是该关系的码,但它是其他关系的码,那么该属性对关系模式 R 而言是外码
全码(All-key):关系模型的所有属性组是这个关系模式的候选码,称为全码
关系代数运算
关系代数的运算符有 4 类:集合运算符、专门的关系运算符、算术比较符和逻辑运算符
集合运算符和专门的关系运算符
外连接运算符
关系数据库设计基本理论
函数依赖
主键与属性的关系,主键决定属性
平凡的函数依赖
X->Y,Y是X的子集
非平凡的函数依赖
X->Y,Y不是X的子集
完全函数依赖
X->Y,如果不存在X的子集X'能决定Y,则是完全依赖
部分函数依赖
X->Y,如果存在X的子集X'能决定Y,则是不完全依赖
传递依赖
若X->Y,Y->C,则X->C
函数依赖的公理系统(Armstrong 公理系统)
从已知的一些函数依赖,可以推导出另外一些函数依赖,这就需要一系列推理规则,这些规则常被称作“Armstrong 公理”
推理规则
自反律
若Y是X的子集,则X->Y
增广律
若X->Y,则XZ->YZ
传递律
若X->Y,Y->Z,则X->Z
合并规则
若X->Y,X->Z,则X->YZ
伪传递规则
若X->Y,WY->Z,则XW->Z
分解规则
若X->Y,Z是Y的子集,则X->Z
关系数据库的规范化
第一范式1NF
属性不可以再分解
举例:家庭信息里几口人、住址,不应该以逗号分隔方式放到一个属性里,应该拆分成多个属性
第二范式2NF
不存在非主属性对候选码的部分函数依赖
举例:订单的金额和时间应该放在主表,不应该冗余在订单明细表
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
第三范式3NF
任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
举例:订单表里只存储下单人id即可,不需要存储下单人姓名、手机号,这俩个属性依赖下单人id,不依赖订单号
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
巴斯-科德范式BCNF
消除主属性对码的部分函数依赖和传递函数依赖
举例:仓库的管理员和存储物品不能都放到仓库明细表,应该拆成仓库管理员表和仓库物品表
BCNF范式排除了任何属性(不光是非主属性,2NF和3NF所限制的都是非主属性)对候选键的传递依赖与部分依赖
事务管理
DBMS 运行的基本工作单位是事务,事务是用户定义的一个数据库操作序列,这些操作序列要么全做,要么全都不做,是一个不可分割的工作单位。
特性:
原子性(Atomicity):事务是数据库的逻辑工作单位,事务的所有操作在数据库中要么全做,要么全都不做。
一致性(Consistency):事务的执行使数据库从一个一致性状态变成另一个一致性状态。
两个链接:
链接1:
链接2:
隔离性(Isolation):一个事务的执行不能被其他事务干扰。
持久性(Durability):指一个事务一旦提交,它对数据库的改变必须是永久的,即便系统出现故障时也是如此。
并发控制
在多用户共享系统中,许多事务可能同时对同一数据进行操作,称为并发操作
并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,同时避免用户得到不正确的数据
并发控制的主要技术是封锁,主要有两种类型的封锁:
排他型封锁(X 封锁)
阻塞其他事务的读写操作
共享型封锁(S 封锁)
读锁阻塞其他事务写操作,不阻塞其他事务读操作
数据库的备份与恢复
备份(转储)与恢复:
备份是指通过数据转储和监理日志文件的方法监理冗余数据,DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程
这些备用的数据文本称为后备副本
数据库的恢复是指把数据库从错误状态恢复到某一个已知的正确状态的功能
备份分类包括以下 4 种:
静态备份:指备份期间不允许(或不存在)对数据库进行任何存取、修改活动。
动态备份:指备份期间允许对数据库进行存取或修改,即备份和用户事务可以并发执行
海量备份:指每次备份全部数据库
增量备份:指每次只备份上次备份后更新过的数据。如果数据库很大,事务处理又十分频繁,则增量备份方式是很有效的
数据库的 4 类故障:事务故障、系统故障、介质故障、计算机病毒
事务故障的恢复有两个操作:撤销事务(UNDO)和重做事务(REDO)
介质故障的恢复由数据库管理员装入数据库的副本和日记文件副本,再由系统执行撤销和重做操作。
应用程序与数据库的交互
库函数级别访问接口
库函数级别的数据访问接口是数据库提供的最底层的高级程序语言访问数据接口,如 Oracle数据库的 Oracle Call Interface(OCI)
OCI 由一组应用程序开发接口(API)组成,实际是将结构化查询语言(SQL)和高级语言程序相结合
其缺点是强依赖于特定的数据库,需数据库开发人员对数据库机制有较深的理解,学习难度较大,开发效率不是很高
嵌入式 SQL 访问接口
嵌入式 SQL(Embeded SQL)是一种将 SQL 语句直接写入某些高级程序语言源代码中的方法
通用数据接口标准
开放数据库连接(Open DataBase Connectivity,ODBC)是为解决异构数据库间的数据共享产生的
优点是不依赖于任何 DBMS,能以统一的方式处理所有的关系数据库
常见数据库接口包括:
数据库访问对象(Data Access Object,DAO)
远程数据库对象(Remote Data Object,RDO)
ActiveX 数据对象(Active Data Object,ADO)
Java 数据库连接(java DataBase Connection,JDBC)
ORM 访问接口
对象关系映射(Object Relationship Mapping,ORM)用于实现面向对象编程语言里不同类型系统数据之间的转换
典型的 ORM 框架有 Hibernate、Mybatis 和 JPA 等
分布式数据库
分布式数据库的体系结构
分布式数据库的体系结构图
全局视图:全局视图(全局外模式)是全局应用的用户视图,是全局概念模式的子集,该层直接与用户(或应用程序)交互
全局概念模式:全局概念模式定义分布式数据库中数据的整体逻辑结构,数据就如同根本没有分布一样,可用传统的集中式数据库中所采用的方法进行定义
分片模式:将一个关系模式分解成为几个数据片
分配模式:分布式数据库的本质特性就是数据分布在不同的物理位置。分配模式的主要职责是定义数据片段(即分片模式的处理结果)的存放节点
局部概念模式:局部概念模式是局部数据库的概念模式
局部内模式:局部内模式是局部数据库的内模式
分布式数据库具有如下特点:
共享性:不同的节点的数据共享
自治性:每个节点对本地数据都能独立管理
可用性:某一场地故障时,可以使用其他场地上的副本而不至于使整个系统瘫痪
分布性:数据分布在不同场地上存储
分布透明性
分布透明性是指用户不必关心数据的逻辑分片,不必关心数据存储的物理位置分配细节,也不必关心局部场地上数据库的数据模型
分布透明性包括:
分片透明性
分片透明性是分布透明性的最高层次。所谓分片透明性是指用户或应用程序只对全局关系进行操作而不必考虑数据的分片。
位置透明性
位置透明性是分布透明性的下一层次。所谓位置透明性是指用户或应用程序应当了解分片情况,但不必了解片段的存储场地。
局部数据模型透明性
局部数据模型透明性(逻辑透明)是指用户或应用程序应当了解分片及各片断存储的场地,但不必了解局部场地上使用的是何种数据模型
分布式缓存技术 Redis
基本概念
Redis 是一种分布式缓存技术,也是一种键值对数据库类型。Redis 用作缓存组件时,其基于内存的读写特性,比基于磁盘读写的数据库性能要高很多,适合缓存高频热点的数据,来提高读性能。
使用Redis可以降低对数据库服务器的查询请求,提高系统性能。
Redis 以 key-value(键值对)的形式为数据的保存格式。
键(key)可以是一个字符串,值(value)可以是任意类型的数据。如整型、字符型、数组、列表、集合等
数据类型
string 类型:是 Redis 基本类型。可用于缓存层或计数器,如视频播放量、文章浏览量等
hash 类型:代替 string 类型,节省空间。描述用户信息较为方便
set 类型:无序集合,每个值不能重复。可用于去重、抽奖、初始化用户池等
list 类型:双向链表结构,可以模拟栈、队列等形式。可用于回复评论、点赞
zset 类型:有序集合、每个元素有一个分数。如首页推荐 10 个最热门的帖子
访问方式
引入 Redis 后,热点数据存放在 Redis 中,但由于存在“一份数据存放了多个位置”,所以要考虑数据的一致性问题
读写数据的基本步骤为:
读数据:
①根据 key 读缓存
②读取成功则直接返回
③若 key 不在缓存中,则根据 key读数据库
④读取成功后,写缓存
⑤成功返回
写数据:
①根据 key 值写数据库
②成功后更新缓存 key 值
③成功返回
过期策略
在使用 Redis 时,一般会设置 Redis 缓存空间的大小,不会让数据无限制地存放到 Redis 中,对于设置了过期时间的数据可以采用两种方式去淘汰这些数据
定期删除
Redis 每隔一段时间就会抽取一些设置了过期时间的 key
抽取是随机进行的,因为无法对所有的 key 进行遍历,会给系统带来很大的负担。但是这样也会导致一些 key到了过期时间也仍然没有被删除
惰性删除
查询 key 的时候 Redis 会对 key 进行检测,发现如果已经达到过期时间,则删除
惰性删除的缺点是如果这些过期的 key 没有被访问,那么它们就一直无法被删除,而且一直占用内存
其他淘汰机制:
volatile-lru(最近最少使用):从已设置过期时间的 key 中,移出最近最少使用的 key 进行淘汰
volatile-lfu(最不经常使用):从 key 中选择最不经常使用的进行淘汰
volatile-random(随机淘汰算法):从已设置过期时间的 key 中随机选择 key 淘汰
volatile-ttl(生存时间淘汰):从已设置过期时间的 key 中,移出将要过期的 key
allkeys-lru:从所有 key 中选择最近最少使用的进行淘汰
allkeys-lfu:从所有 key 中选择最不经常使用的进行淘汰
allkeys-random:从所有 key 中随机选择 key 进行淘汰
数据持久化
RDB 内存快照(Redis Data Base)
AOF 日志(Append Only File)
缓存异常问题
缓存穿透
大量请求访问了没有缓存的 key,即大量的 key 在 Redis 里是不存在的,从而导致请求直接访问数据库,数据库压力增大
可能的原因:
恶意攻击,造成大量访问不存在的 key。
解决方案:
①针对比较少的请求来源 IP,主动限制其访问次数,或者拉入黑名单
②应用程序来检查 key 的合法性,提前拒绝不合法的请求
③使用布隆过滤器
大量请求访问数据库里有但 Redis 没有的 key
解决方案:
①预热 Redis,运行一个批处理脚本,将可能会大量访问的数据预先加载到 Redis
②在最前端进行流量控制,逐步把请求释放进来。给出一段时间,让 Redis 逐步加载热数据
③如果是在数据库里也没有的 key,也需要在 Redis 中设置 key,使其值为 null 或空
缓存雪崩
大量请求访问到缓存中的 key,这些 key 是存在的,但同时到了过期时间,从而导致请求直接访问数据库,数据库压力增大
可能的原因:
Redis 故障。比如 Redis 宕机,网络出现抖动等
解决方案:
①使用主从复制提高可用性,使用 cluster 集群方案降低故障时影响的范围
②如果出现故障,则可以采取服务降级、熔断、限流等措施
大量的 key 采用了相同的过期时间
解决方案:
过期时间加上一个随机值,使得众多 key 均匀过期。
缓存击穿
少量热点的 key 缓存时间失效了,使得请求直接访问数据库
可能的原因:
热点的 key 设置了太短的过期时间
解决方案:
①将 key 设置较长的过期时间。对于非常重要的 key,则设置永久有效。但需要解决好与数据库中的 key 的一致性问题
②使用分布式锁。如果热点 key 失效了,要控制好访问后端数据库的流量。只允许一个请求去访问数据库,取出最新的 key,存放到 Redis,其他请求则必须等待
Redis 集群
Redis 也可以采用集群的方式部署,主要有主从复制集群、哨兵集群、Cluster 集群方式
集群切片的方式主要分为客户端分片、代理分片、服务器端分片三种方式
数据库基础概念
数据(Data):是描述事物的符号记录,它具有多种表现形式,如文字、图形、图像、声音和语言等
数据库系统(DataBase System,DBS):是一个采用了数据库技术,有组织地、动态地存储大量相关联数据,从而方便多用户访问的计算机系统
数据库(DataBase,DB):是统一管理的、长期储存在计算机内的,有组织的相关数据的集合
数据库管理系统(DataBase Management System,DBMS):是数据库系统的核心软件,是由一组相互关联的数据集合和一组用以访问这些数据的软件组成
DBMS 通常分三类:关系数据库系统(Relation DataBase System,RDBS)、面向对象的数据库系统(Object-Oriented DataBase Systems,OODBS)、对象关系数据库系统(Objective Relational DataBase System,ORDBS)
发展阶段
人工管理阶段。
文件系统阶段。
数据库系统阶段。
数据模型三要素:
数据结构
数据操作
数据的约束条件
实体完整性。实体完整性是指实体的主属性不能取空值。
参照完整性。在关系数据库中主要是指外键参照的完整性。
用户定义完整性。用户定义完整性反映的是某一个具体应用所对应的数据必须满足一定的约束条件。
数据库管理系统
主要功能包括数据定义,数据库操作,数据库运行管理,数据组织、存储和管理,数据库的建立和维护
特点:数据结构化且统一管理、有较高的数据独立性、数据控制功能
数据控制功能包括:保证护具的安全性和完整性以及并发控制的能力
数据库三级模式两级映像
从数据库管理系统的角度,数据库也分为外模式、概念模式和内模式
数据库系统在三级模式之间提供了两级映像:概念模式/内模式映像、外模式/概念模式映像
两级映像保证了数据库中的数据具有较高的逻辑独立性和物理独立性
数据库系统体系结构
三级模式两级映像
数据库设计
数据库设计的基本步骤
用户需求分析
用户需求分析是综合各用户的应用需求,对现实世界要处理的对象进行详细调查,在了解先行系统的概况,确定新系统功能的过程中,协助用户明确对新系统的信息要求、处理要求和系统要求,确定新系统的边界
概念结构设计
概念数据模型又称为实体-联系模型,它按照用户的观点来对数据和信息建模
概念模型主要用实体-联系方法(Entity-Relationship Approach)表示,简称 E-R 方法
概念结构设计工作步骤包括:选择局部应用、逐一设计分 E-R 图和 E-R 图合并
在进行 E-R 图合并时,需解决属性冲突、命名冲突和结构冲突
E-R 模型简称 E-R 图,是描述概念世界、建立概念模型的实用工具
E-R 图的三个要素有:
实体(型):用矩形框表示,框内标注实体名称。
属性:用椭圆形表示,并用连线与实体连接起来。
实体之间的联系:用菱形框表示,框内标注联系名称,用连线将菱形框分别与有关实体相连,并在连线上注明联系类型。
逻辑结构设计
逻辑结构设计阶段主要工作步骤包括确定数据模型、将 E-R 图转换成指定的数据模型、确定完整性约束和确定用户视图
物理结构设计
物理设计主要工作步骤包括确定数据分布、存储结构和访问方式
应用程序设计
运行维护
数据库实施。数据库实施是根据逻辑和物理设计的结果,在计算机上建立实际的数据库结构,数据加载(装入),进行试运行和评价
数据库运行维护
数据库运行维护主要包括对数据库性能的监测和改善、故障恢复、数据库的重组和重构
在数据库运行阶段,对数据库的维护主要由 DBA 完成
商业智能
商业智能(Business Intelligence,BI)是企业对商业数据的搜集、管理和分析的系统过程,目的是使企业的各级决策者获得知识或洞察力,帮助他们作出对企业更有利的决策
三大组成部分
数据仓库
是一个面向主题的、集成的、相对稳定且随时间变化的数据集合,用于支持管理决策。数据仓库的关键特征是:面向主题、集成的、非易失的、时变的
传统数据库与数据仓库的比较见表
联机分析处理(OLAP)
OLTP 与 OLAP 的比较:
OLTP 即联机事务处理,就是我们经常说的关系数据库的基础
OLAP即联机分析处理,是数据仓库的核心部分
OLTP 与 OLAP 的具体区别
数据挖掘
数据挖掘是在没有明确假设的前提下去挖掘信息、发现知识
数据挖掘所得到的信息应具有先前未知、有效和实用三个特征
先前未知的信息是指该信息是预先未曾预料到的,即数据挖掘是要发现那些不能靠直觉发现的信息或知识,甚至是违背直觉的信息或知识,挖掘出的信息越是出乎意料,就可能越有价值
NoSQL数据库
分类与特点
NoSQL 是一种概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID 特性
NoSQL 数据库按照所使用的数据结构的类型,可分为:
列式存储数据库
列式存储数据库用来应对分布式存储的海量数据,键仍然存在,特点是指向了多个列。现有产品如 Cattandra、HBate、Riak
键值对存储数据库
键值对存储数据库优势是简单、易部署。但是只对部分值查询或更新时效率低下。现有产品如 Tokzo Cabinet/Tzranu、Redis、Voldemort、Oracle BDB
文档型数据库
文档型数据库在处理网页等复杂数据时,比传统键值对数据库查询效率更高,现有产品如 CouchDB、MongoDB、SequoiaDB
图数据库
图数据库适合存储通过图进行建模的数据,如社交网络数据、生物信息网络数据,交通网络数据等。常见产品有 Neo4J、InfoGrid、Infinite Graph 等
NoSQL 特征:易扩展、大数据量、高性能、灵活的数据模型、高可用
体系框架
NoSQL 整体框架由下至上分为数据持久层(Data Persistence)、数据分布层(Data Distribution Model)、数据逻辑模型层(Data Logical Model)和接口层(Interface)
NoSQL 数据库适用情况:数据模型比较简单、需灵活性更强的 IT 系统、对数据库性能要求较高、不需要高度的数据一致性
数据库优化技术
集中式数据库优化技术
集中式数据库性能优化最常见的是反规范化设计
主要包括:
增加冗余列。增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。
增加派生列。增加派生列指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量,从而加快查询速度。
重新组表。重新组表指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接,从而提高性能。
水平分割表。按记录进行分割,把数据放到多个独立的表中,主要用于表数据规模很大、表中数据相对独立或数据需要存放到多个介质上时使用。
垂直分割表。对表进行分割,将主键与部分列放到一个表中,主键与其他列放到另一个表中,在查询时减少 I/O 次数。
反规范化设计的优缺点是
优点是避免进行表之间的连接操作,从而可以提高数据操作的性能
缺点是会造成数据的重复存储,浪费了磁盘空间,会产生数据的不一致性问题
若要避免数据不一致的问题,可以通过设置触发器、采用事务机制(适用于单体数据库中)、应用保证(适用于异构数据库之间)以及批处理脚本的方式
分布式数据库优化技术
主从复制
主从复制是建立一个和主数据库完全一样的数据库环境,称为从数据库
好处是:
做数据的热备。作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展。业务量越来越大,I/O 访问频率过高,单机无法满足,此时做多库的存储,降低磁盘 I/O 访问的频率,提高单个机器的 I/O 性能。
读写分离。使数据库能支持更大的并发。
MySQL 主从复制
在 MySQL 数据库中,主从数据库同步的模式有全同步、半同步、异步三种方式。主从数据库之间通过 binlog(二进制日志)进行数据的同步
MySQL主从复制过程
binlog 日志有 3 种模式:
基于 SQL 语句的复制
每一条更新的语句(insert、update、delete)都会记录在 binlog 中,进而同步到从库的 relaylog 中,被从库的 SQL 线程取出来,回放执行
该模式的优点是 binlog 的日志量可能会比较少,比如一个涉及行数为 1000 行的 update 语句,同步这一个语句,就同步了 1000行的数据
缺点是同步的 SQL 语句里如果含有绑定本地变量的函数、关键字,可能造成主从不一致的情况。比如 SQL 语句中有 time 函数,如果主从数据库的服务器时间不是精确相等,就会造成结果不一致。
基于行的复制
不记录 SQL 语句,只记录哪个记录更新前和更新后的数据,可以保证主从之间的数据绝对相同
缺点是:1 条 SQL 更新 1000 行的数据无法再偷懒,必须原原本本同步 1000行的数据量
混合复制
以上两种模式的混合,选取两者的优点
对于有绑定本地特性、评估可能造成主从不一致的 SQL 语句,则自动选用基于行的复制,其他的选择基于 SQL 语句的复制
读写分离
设置不同的主、从数据库分别负责不同的操作
让主数据库负责数据的写操作,从数据库负责数据的读操作
通过角色分担的策略,分别提升读写性能,有效减少数据并发操作的延迟
分表
分表也叫分片,可以提升数据库并发以及 I/O 的性能
分表重在单个实例内部,将一张大表分成若干小表,业务同时访问多个表
分表的方式有两种:
垂直切分
把一个大表切分为多个表。例如交易 ID、状态、用户、金额、商品等,作为一个热表;另外的交易备注、物流信息等众多其他属性可作为另一个表
水平切分
把一个大表分为多个表,每个表都包含相同列,例如交易 ID、状态、用户、金额、商品等,但都包含不同的行。
分库
分库是将原本存放在一个实例上众多分类的数据(表),分开存放到不同的实例上。有利于差异化管理
0 条评论
下一页