【系统架构设计】数据库系统(二)

数据库模式与范式

数据库设计

数据库设计的方法

目前已有的数据库设计方法可分为四类:直观设计法、规范设计法、计算机辅助设计法和自动化设计法。其中,基于3NF的数据库设计方法,其具体设计步骤分为5个阶段,如图3-2所示。

在这里插入图片描述

数据库设计的基本步骤

分步设计法遵循自顶向下、逐步求精的原则,将数据库设计过程分解为若干相互独立又相互依存的阶段,每一阶段采用不同的技术与工具,解决不同的问题,从而将问题局部化,减少了局部问题对整体设计的影响。在分步设计法 中,通常把数据库的设计分为需求分析、概念结构设计、逻辑结构设计和数据库物理设计 4个阶段,如图3-3所示。

在这里插入图片描述

  1. 需求分析:指收集和分析用户对系统的信息需求和处理需求,得到设计系统所必需的需求信息,建立系统说明文档。其目标是通过调查研究,了解用户的数据要求和处理要求,并按一定格式整理形成需求说明书。该阶段的任务是
  • 确认需求、确定设计目标
  • 分析和收集数据
  • 整理文档
  1. 概念结构设计:其目标是对需求说明书提供的所有数据和处理要求进行抽象与综合处理,按一定的方法构造反映用户环境的数据及其相互联系的概念模型,即用户的数据模型或企业数据模型这种概念数据模型与DBMS无关,是面向现实世界的、极易为用户所理解的数据模型。概念模型的描述工具应该能够体现概念模型的特点,如E-R模型。概念结构的设计策略主要有自底向上、自顶向下、由里向外和混合策略
  2. 逻辑结构设计:设计目标是把上一阶段得到的与DBMS无关的概念数据模型转换成等价的,并为某个特定的DBMS所接受的逻辑模型所表示的概念模型,同时将概念设计阶段得到的应用视图转换成外部模式,即特定DBMS下的应用视图。该阶段的结果是用DBMS所提供的数据定义语言(DDL)写成的数据模式
  3. 数据库物理设计:任务是将逻辑设计阶段得到的满足用户需求的已确定的逻辑模型在物理上加以实现,其主要内容是根据DBMS提供的各种手段,设计数据的存储形式和存取路径,如文件结构、索引设计等,即设计数据库的内模式或存储模式。

ps: 概念设计可以理解为E-R的实物图,逻辑结构设计就涉及到了具体的表格设计,物理设计就是最底层的怎么去存储提高性能。

事务管理

数据库系统运行的基本工作单位是事务,相当于操作系统中的进程,是用户定义的一个数据库操作序列,这些操作序列要么全做要么全不做,是一个不可分割的工作单位。事务具体以下特性:

  1. 原子性(Atomicity ):数据库的逻辑工作单位;
  2. 一致性(Consistency):使数据库从一个一致性状态变成另一个一致性状态;
  3. 隔离性(Isolation):不能被其他事务干扰;
  4. 持续性(永久性)(Durability):一旦提交,改变就是永久性的。

事务提交语句: 表示事务执行成功的结束;
事务回退语句:表示事务执行不成功的结束。

并发控制

在多用户共享系统中,许多事务可能同时对同一数据进行操作,称为“并发操作",此时数据库管理系统DBMS的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,同时避免用户得到不正确的数据。并发操作带来的问题有:丢失更新问题、不一致分析问题(读过时的数据)、依赖于未提交更新的问题(读了”脏“数据)。这三个问题需要DBMS 的并发控制子系统解决,主要方法是采用封锁技术,它有2种类型:

  • 排他型封锁(简称 X封锁):如果事务T 对数据A 实现X封锁,那么只允许T 读取和修改数据A,其他事务要等T解除X封锁后,才能对数据A实现任何类型的封锁。即只允许一个事务独锁和使用数据
  • 共享型封锁(简称 S封锁):如果事务T 对数据A 实现S封锁,那么允许T读取数据A ,但不能修改数据A ,在所有S封锁解锁前,绝不允许任何事务对数据A 实现X封锁。即可以允许并发读,但不允许修改

ps:脏数据是指没有经过预处理而直接接收到的原始数据,或者不符合特定分析要求的数据。

在多个事务并发执行的系统中,主要采用封锁协议来进行处理:

  • 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。该协议可以防止丢失修改,并保证事务T是可恢复的,但不能保证可重复读和不读脏数据。
  • 二级封锁协议:一级封锁协议加上事务T在读取数据R之前先对其加S锁,读完后即可释放S锁。该协议可以防止丢失修改,防止读脏数据,但不能保证可重复读。
  • 三级封锁协议:一级封锁协议加上事务T在读取数据R之前先对其加S锁,直到事务结束才释放。该协议可以防止丢失修改,防止读脏数据,保证可重复读。
  • 两段锁协议:所有事务必须分2个阶段对数据项加锁和解锁,其中扩展阶段是在对任何数据进行读写操作之前,首先要申请并获得该数据的封锁;收缩阶段是在释放一个封锁之后,事务不能再申请和获得任何其他封锁。若并发执行的所有事务均遵守两段封锁协议,则对这些事务的任何并发调度策略都是可串行化的。但遵守两段锁协议的事务可能发生死锁,而死锁是不可避免的,目前采用** 预防法** 和死锁的解除法来进行处理。。

可串行化调度是指多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。这种调度策略确保了数据库的一致性和正确性,避免了数据不一致的情况,如丢失修改、读“脏”数据和不可重复读等。
封锁是指事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。

封锁的粒度 是被封锁数据目标的大小。封锁粒度小则并发性高,但开销大;封锁粒度大则并发性低,但开销小

故障和恢复

数据库的故障可用事务的故障来表示,主要有4种:

  1. 事务故障:事务在运行过程中由于种种原因,如输入数据的错误、运算溢出、违反了某些完整性限制、某些应用程序的错误,以及并发事务发生死锁等,使事务未运行至正常终止点就被撤销。
  2. 系统故障:是指系统在运行过程中,由于某些原因(如操作系统或数据库管理系统代码错误、操作员操作失误、特定类型的硬件错误(如CPU故障)、突然停电等造成系统停止运行),致使事务在执行过程中以非正常方式终止,这时内存中的信息丢失,但存储在外存上的数据不会受影响
  3. 介质故障:系统在运行过程中,由于某种硬件故障,如磁盘损坏、磁头碰撞或由于操作系统的某种潜在的错误、瞬时强磁场干扰,使存储在外存上的数据部分损失或全部损失
  4. 计算机病毒:是一种人为破坏计算机正常工作的特殊程序。

分别对应的故障恢复,最常用的恢复方式是** 转储和登记日志文件**,可根据故障的不同类型,采用不同的恢复策略。

  1. 事务故障的恢复,由系统自动完成,不用用户干预,步骤如下:
  • 反向扫描文件日志,查找该事务的更新操作;
  • 对该事务的更新操作执行逆操作;
  • 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理;
  • 如此处理下去,直至读到此事务的开始标记,事务故障恢复完成。
  1. 系统故障的恢复,系统故障发生时,造成数据库不一致状态原因有2个:一是由于一些未完成事务对数据库的更新已写入数据库;二是由于一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库。系统故障的恢复是在重新启动时自动完成,不需要用户干预,步骤如下:
  • 正向扫描日志文件,找到在故障发生前已经提交的事务,将其事务标识记入重做(Redo)队列,同时找出故障发生时尚未完成的事务,将其事务标识记入撤销(Undo)队列;
  • 对撤销队列中的各个事务进行撤销处理:反向扫描日志文件,对每个Undo事务的更新操作执行逆操作;
  • 对重做队列中的各个事务进行重做处理:正向扫描日志文件,对每个Redo事务重新执行日志文件登记的操作。

ps:可以理解成:故障发生前事务结束,放在缓冲区的更新操作,恢复目的是要执行完;故障发生时事务进行中,恢复目的是要回退。

  1. 介质故障与病毒破坏的恢复,此时磁盘上的物理数据库被破坏了,步骤如下:
  • 装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态;
  • 从故障点开始反向读日志文件,找出已提交事务标识将其记入重做队列;
  • 从起始点开始正向阅读日志文件,根据重做队列中的记录,重做所有已完成事务,将数据库恢复至故障前某一时刻的一致状态。

备份与恢复

备份与恢复计划制定要遵循2个原则:

  • 保证数据丢失的情况尽量少或者完整不丢失;
  • 备份和恢复时间尽量短,保证系统最大的可用性。

数据库备份按照不同方式可以分为多种,按照** 备份内容** 分为物理备份 和** 逻辑备份**

  1. 物理备份是在操作系统层面对数据库的数据文件进行备份,分为冷备份和热备份
  • 冷备份:将数据库正常关闭,在停止状态下利用操作系统的命令将数据库文件全部备份下来,当数据库发生故障时,将数据文件复制回去,进行恢复。
  • 热备份分2种,一种是不关闭数据库,将数据库中需要备份的数据文件依次置于备份状态相对保持静止,然后再利用操作系统的命令将数据库文件备份下来,备份完毕后再将数据文件恢复为正常状态,当数据库发生故障时,恢复方法同冷备份;另一种是利用备份软件(如ServHA),在数据库正常运行状态下,将数据库中数据文件备份出来。

为提高物理备份效率,通常将完全、增量、累积三种备份方式相组合。

ps:累积备份是将自上次完全或累积备份以来所有修改过的数据备份;增量备份是只备份修改的数据。

  1. 逻辑备份是指利用各数据库系统自带的工具软件备份和恢复数据库的内容

分布式数据库系统

数据仓库

数据挖掘

NoSQL

大数据

相关推荐

  1. 系统架构设计师——数据模型

    2024-07-19 00:02:03       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 00:02:03       53 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 00:02:03       56 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 00:02:03       46 阅读
  4. Python语言-面向对象

    2024-07-19 00:02:03       57 阅读

热门阅读

  1. js基础知识

    2024-07-19 00:02:03       24 阅读
  2. vivado H_SET and HU_SET

    2024-07-19 00:02:03       18 阅读
  3. xhdra的使用记录

    2024-07-19 00:02:03       19 阅读
  4. Docker无网环境下配置方法

    2024-07-19 00:02:03       18 阅读
  5. 手动实现堵塞队列

    2024-07-19 00:02:03       20 阅读
  6. pytorch中numel()函数用于获取张量中元素数目

    2024-07-19 00:02:03       17 阅读
  7. CSS浮动

    CSS浮动

    2024-07-19 00:02:03      16 阅读
  8. 什么是虚拟DOM?什么是diff算法?

    2024-07-19 00:02:03       18 阅读
  9. 什么是CAP理论?

    2024-07-19 00:02:03       17 阅读
  10. Hive修改表中的某个值

    2024-07-19 00:02:03       20 阅读
  11. HTTP请求五类状态码详细介绍,以及部分处理思路

    2024-07-19 00:02:03       21 阅读