系分 - 案例分析 - 数据库设计(基本)
个人总结,仅供参考,欢迎加好友一起讨论
文章目录
- 系分 - 案例分析 - 数据库设计(基本)
- 数据库基础
- 数据库设计
- 规范化(范式)
- 数据库事务
- 并发控制
- 典型例题
- 题目描述
- 参考答案
- 数据库安全性技术
- 视图
- 物化视图
- 存储过程
- 触发器
- 典型例题 1
- 题目描述
- 参考答案
- 典型例题 2
- 题目描述
- 参考答案
- 反规范化
- 反规范化技术
- 典型例题
- 题目描述
- 参考答案
- 数据库性能优化
系分 - 案例分析 - 数据库设计(基本)
数据库基础
数据库设计
规划(不一定有):进行建立数据库的必要性及可行性分析,确定数据库系统在企业和信息系统中的地位,以及各个数据库之间的联系。
需求分析:通过调查研究,了解用户的数据和处理要求,并按一定格式整理形成需求说明书。
概念设计:在需求分析阶段产生的需求说明书的基础上,按照特定的方法将它们抽象为一个不依赖于任何数据库管理系统的数据模型,即概念模型。
逻辑设计:将概念模型转化为某个特定的数据库管理系统上的逻辑模型。设计逻辑结构时,首先为概念模型选定一个合适的逻辑模型(通常是关系模型),然后将其转化为由特定DBMS支持的逻辑模型,最后对逻辑模型进行优化。
物理设计:对给定的逻辑模型选取一个最适合应用环境的物理结构,所谓数据库的物理结构,主要是指数据库在物理设备上的存储结构和存取方法。
规范化(范式)
思考:范式级别提升带来了什么负面影响?
数据库事务
事务的4个属性(4个特性): | |
原子性 | 操作,操作序列(事务)要么全做,要么全不做 |
一致性 | 数据,数据库从一个一致性状态,变到另一个一致性状态 |
隔离性 | 执行,一个事务的执行不能被其他事务干扰 |
持续性 | 变化,一个事务一旦提交,它对数据库的改变是永久的,即便系统出现了故障 |
并发控制
并发产生的问题: |
---|
丢失更新 |
不可重复读问题 |
读出“脏”数据 |
丢失更新 | 两个事务T1和T2同时读入同一数据并修改,T2提交的结果将破坏T1的结果,T1的修改被丢失 |
对T1加X锁(写锁),那么T2只能在T1解锁后读 | |
读赃数据 | T1修改了某一个数据,T2读取了同一个数据,T1由于某种原因被撤销,则T2读到的数据就是赃数据 |
修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放T1读取数据时加上共享锁后,不允许任何事物操作该数据,只能读取 | |
不可重复读 | T1读取某一数据,T2读取某一数据,并进行修改,T1为了对读取值进行校对再读取时,得到不同结果 |
T1加X锁(写锁)后,T2对同一数据加X锁(写锁),这样T1的锁解开后,才可以调用T2 |
一级封锁协议 | 事务T1在修改A之前必须先对其加X锁,直到事务结束才释放 可防止丢失修改 |
二级封锁协议 | 在一级封锁协议加上事务T1在读取数据A之前先对其加S锁,读完后即可释放S锁 可防止丢失修改,可防止读脏数据 |
三级封锁协议 | 在一级封锁协议加上事务T1在读取数据R之前先对其加S锁,直到事务结束时才释放 可防止丢失修改,可防止读脏数据,防止数据重复读 |
两段锁协议 | 分为封锁阶段(扩展)和释放阶段(收缩)。封锁阶段只能加锁、扩展阶段只能解锁 可串行化的,可能发生死锁 |
典型例题
题目描述
阅读以下关于数据库设计的叙述,在答题纸上回答问题1至问题3。
某航空公司要开发一个订票信息处理系统,以方便各个代理商销售机票。开发小组经过设计,给出该系统的部分关系模式如下:
航班(航班编号,航空公司,起飞地,起飞时间,目的地,到达时间,剩余票数,票价)
代理商(代理商编号,代理商名称,客服电话,地址,负责人)
机票代理(代理商编号,航班编号,票价)
旅客(身份证号,姓名,性别,出生日期,电话)
购票(购票单号,身份证号,航班编号,搭乘日期,购票金额)
在提供给用户的界面上,其核心功能是当用户查询某航班时,将该航班所有的代理商信息及其优惠票价信息,返回给用户,方便用户购买价格优惠的机票。在实现过程中发现,要实现此功能,需要在代理商和机票代理两个关系模式上进行连接操作,性能很差。为此开发小组将机票代理关系模式进行了扩充,结果为:
机票代理(代理商编号,航班编号,代理商名称,客服电话,票价)
这样,用户在查找信息时只需对机票代理关系模式进行查询即可,提高了查询效率。
【问题1】
机票代理关系模式的修改,满足了用户对代理商机票价格查询的需求,提高了查询效率。但这种修改导致机票代理关系模式不满足3NF,会带来存储异常的问题。
1)请具体说明其问题,并举例说明。
2)这种存储异常会造成数据不一致,请给出解决该存储异常的方案。
【问题2】
在机票销售信息处理系统中,两个代理商的售票并发执行,可能产生的操作序列如下表所示。
假设两个代理商执行之前,该航班仅剩1张机票。
1)请说明上述两个代理商操作的结果。
2)并发操作会带来数据不一致的问题,请具体说明3种问题。
【问题3】
为了避免问题2中的问题,开发组使用库的读写锁机制,操作序列变为下表所示。
参考答案
【问题1】
1)不满足3NF会产生函数的传递依赖,造成数据冗余和修改异常等问题。
① 数据冗余,一个代理商会代理多家航班的机票销售业务,在机票代理模式中,该代理商的代理商名称,客服电话就会被存储多次,造成数据的冗余。
② 修改异常,当需要修改该代理商的名称或客服电话时,就要修改所有相应元组中的名称或客服电话,否则就会出现客服电话值不一致的现象,产生修改异常。
【问题2】
1)2个代理商都成功售出1张票,剩余票数为0。
2)数据库的并发操作会带来一些数据不一致问题。例如,丢失修改、读脏数据和不可重复读等。
① 丢失修改。事务A与事务B从数据库中读入同一数据并修改,事务B的提交结果破坏了事务A提交的结果,导致事务A的修改被丢失。
② 读脏数据。事务A修改某一数据,并将其写回磁盘,事务B读取同一数据后,事务A由于某种原因被撤消,从而导致事务B读到的数据是无效数据。
③ 不可重复读。事务A读取数据后,事务B又修改了该数据,但事务A使用的仍是修改之前的值。因此。事务A与实务B分别得到不同的结果,产生了数据的不一致性。
【问题3】
(1)加写锁
(2)加读锁
(3)加写锁
(4)等待
(5)查询剩余票数
(6)加写锁
数据库安全性技术
措施 | 说明 |
---|---|
用户标识和鉴别 | 最外层的安全保护措施,可以使用用户账户、口令和随机数检验等方式 |
存取控制(数据授权) | 对用户进行授权,包括操作类型(例如,査找、更新或删除等)和数据对象的权限 |
密码存储和传输 | 对远程终端信息用密码传输 |
视图的保护 | 通过视图的方式进行授权 |
审计 | 用一个专用文件或数据库,自动将用户对数据库的所有操作记录下来 |
视图
视图是保存在数据库中的SELECT查询,其内容由查询定义,因此,视图不是真实存在的基础表,而是从一个或者多个表中导出的虚拟的表。同真实的表一样,视图包含一系列带有名称的列和行数据,但视图中的行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
视图优点如下:
- 视点集中,视图只展示与用户相关的数据。
- 简化操作,在每一次执行相同的查询时,不必重新写查询语句,只要一条简单的查询视图语句即可。
- 定制数据,视图能够实现让不同的用户以不同的方式看到不同或相同的数据集。
- 合并分割数据,在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
- 安全性,视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
物化视图
在物化视图中数据查询结果被物理固化起来,其数据随着原始表变化,同步更新。物化视图也可以称为快照。
存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程是数据库所提供的一种数据库对象,通过存储过程定 义一段代码,提供给应用程序调用来执行。 从安全性的角度考虑,更新数据时,通过提供存储过程让第三方调用,将需要更新的数据传入存储过程,而在存储过程内部用代码分别对需要的多个表进行更新,从而避免了向第三方提供系统的表结构,保证了系统的数据安全。
触发器
触发器是一种特殊的存储过程,当数据发生变化时,触发器会产生某种动作。使用触发器有助于强制保持数据库的数据完整性。
典型例题 1
题目描述
阅读以下关于数据库设计的叙述,在答题纸上回答问题1至问题3。
某软件企业开发一套类似于淘宝网上商城业务的电子商务网站。该系统涉及多种用户角色,包括购物用户,商铺管理员,系统管理员等。
在数据库设计中,该系统数据库的核心关系包括:
产品(产品编码,产品名称,产品价格,库存数量,商铺编码);
商铺(商铺编码,商铺名称,商铺地址,商铺邮箱,服务电话);
用户(用户编码,用户名称,用户地址,联系电话);
订单(订单编码,订单日期,用户编码,商铺编码,产品编码,产品数量,订单总价);
不同用户角色也有不同的数据需求,为此该软件企业在基本数据库关系模式的基础上,定制了许多视图。其中,有很多视图涉及到多表关联和聚集函数运算。
【问题1】
商铺用户需要实时统计本商铺的货物数量和销售情况,以便及时补货,或者为商铺调整销售策略。为此专门设计了可实时查看当天商铺中货物销售情况和存货情况的视图,商铺产品销售情况日报表(商铺编码,产品编码,日销售产品数量,库存数量,日期)。
数据库运行测试过程中,发现针对该视图查询性能比较差,不满足用户需求。 请说明数据库视图的基木概念及其优点,并说明本视图设计导致查询性能较差的原因。
【问题2】
为解决该枧图查询性能比较差的问题,张工建议为该数据建立单独的商品当天货物销售、存货情况的关系表。但李工认为张工的方案造成了数据不一致的问题,必须采用一定的手段来解决。
1)说明张工方案是否能够对该视图查询性能有所提升,并解释原因。
2)解释说明李工指出的数据不一致问题产生的原因。
【问题3】
针对李工提出的问题,常见的解决手段有应用程序实现,触发器实现和物化视图实现等、 请用300字以内的文字解释说明这三种方案。
参考答案
【问题1】
视图是一个虚拟表,并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,
并且在引用视图时动态生成。视图优点如下:
- 视点集中,视图只展示与用户相关的数据。
- 简化操作,在每一次执行相同的查询时,不必重新写查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作。
- 定制数据,视图能够实现让不同的用户以不同的方式看到不同或相同的数据集。
- 合并分割数据,在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。
- 安全性,视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。
由于日销售产品数量基于订单统计而得,而订单表是一张大表,数据量可能非常大,导致统计耗时。
【问题2】
1)能有提升。张工的方案能减少统计分析的数据量。
2)日订单数据存储在订单表和每日货物统计表(销售、存货统计表)两张表中,同一数据存储了两份,很
容易产生数据不同步,也就是数据不一致问题。
【问题3】
程序实现。在订单的增删改操作时,对两张表的都进行相关操作。
触发器实现。如订单发生变化时,通过触发器把当日订单同步到每日货物统计表中。
物化视图。建立“当日销售、存货”物化视图,通过物化视图把相关联的数据关联起来,当订单发生变化时,自动更新,保证数据一致性。
典型例题 2
题目描述
阅读以下关于系统数据分析与建模的叙述,在答题纸上回答问题1至问题3。
某软件公司受快递公司委托,拟开发一套快递业务综合管理系统,实现快递单和物流信息的综合管理。项目组在系统逻辑数据模型设计中,需要描述的快递单样式如下图所示。
下图中是项目组针对该快递单所设计的候选实体及其属性。
【问题1】
数据库设计主要包括概念设计、逻辑设计和物理设计三个阶段,请用200字以内文字说明这三个阶段的主要任务。
【问题2】
根据快递单样式图,请说明:
(1)上图中三个候选实体对应的主属性PK1、PK2和PK3分别是什么?
(2)上图中应设计哪些实体之间的联系,并说明联系的类型。
【问题3】
在上图中添加实体之间的联系后,该实体联系图是否满足第一范式、第二范式和第三范式中的要求(对于每种范式判定时,假定已满足低级别范式要求)。如果不满足,请用200字以内文字分别说明其原因。
参考答案
【问题1】
(1)概念设计也称为概念结构设计,其任务是在需求分析阶段产生的需求说明书的基础上,按照特定的方法将它
们抽象为一个不依赖于任何DBMS的数据模型,即概念模型。概念模型的表现形式即ER模型。
(2)逻辑设计也称为逻辑结构设计,其主要任务是将概念模型转换为某个特定的DBMS上的逻辑模型。
(3)物理设计也称为物理结构设计,其任务是对给定的逻辑模型选取一个最适合应用环境的物理结构。所谓数据
库的物理结构,主要是指数据库在物理设备上的存储结构和存取方法。
【问题2】
(1)
PK1:证件号或联系电话;PK2:编号;PK3:证件号或联系电话。
(2)
联系1:寄件人与快递单之间应有联系,联系类型:1:N。或快递单与寄件人之间应有联系,联系类型:N:1。
联系2:收件人与快递单之间应有联系,联系类型:1:N。或快递单与收件人之间应有联系,联系类型:N:1。
【问题3】
快递单不满足第三范式。因为总计可由前边的保价金额、代收货款、运费、加急费、包装费、保价费等计算得出, 存在传递函数依赖。
反规范化
反规范化技术
技术手段 | 说明 |
---|---|
增加派生性列 | 增加派生列指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量,从而加快查询速度。 例如:已有“单价”和“数量”列,增加“总价”列 |
增加冗余列 | 增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。 例如:已有“学号”列,增加“姓名”列 |
重新组表 | 重新组表指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。 |
分割表 | 水平分割,按记录进行分割,把数据放到多个独立的表中,主要用于表数据规模很大或表中数据相对独立或数据需要存放到多个介质上时使用。 垂直分割,对表进行分割,将主键与部分列放到一个表中,主键与其它列放到另一个表中, 在查询时减少 I/0 次数。 |
反规范化的优点:
- 连接操作少,检索快、统计快。
- 需要查的表减少,检索容易。
缺点:
- 数据冗余,需要更大存储空间
- 插入、更新、删除操作开销更大
- 数据不一致,可能产生添加、修改、删除异常。可借助触发器数据同步,应用程序数据同步,物化视图解决。
- 更新和插入代码更难写
典型例题
题目描述
某集团公司在各省均设有分公司,现欲建立全国统一的销售管理信息系统,以便总公司及时掌握各分公司的销售情况。公司成立专门的项目组进行该系统的研发工作,其中张工负责其中的数据库设计工作。
张工和需求分析小组紧密合作,在设计出数据流图和数据字典的基础上,给出了数据库关系模式和相应的索引设计。同时考虑到未规范化关系模式可能引起的各类数据错误,对关系模式进行了全面的规范化处理,使所有关系模式均达到了3NF或BCNF。
在项目实施过程中,应用开发小组认为该设计方案未考虑应用功能的实际需求。如果严格按照设计方案实施,会对应用系统中整体性能产生较大影响。主要的原因在于进行数据查询时,会产生大量的多表连接操作,影响性能。而设计方案中的索引设计,并不能完全满足数据查询的性能要求。
应用开发小组还认为,该设计方案未考虑到信息系统中核心销售数据处理的特点:各分公司在使用该信息系统时只能操作自己分公司的销售数据,无权操作其它分公司的销售数据;只有总公司有权利操作所有销售数据,以便进行统计分析。
应用开发小组要求,在数据库设计方案中,必须针对实际应用功能的实现来考虑关系模式的规范化,必要时需要采用逆规范化或解除规范化的方法来保证性能要求。
【问题1】
系统需要管理供应商和货物等信息,具体包括供应商姓名、地址以及货物名称、价格等,供应商可以提供0~n种货物,其公司地址也可能发生变化。请以供应商关系模式supplier(name,address,product,price)为例,解释不规范的关系模式存在哪些问题。
【问题2】
应用开发小组认为张工的规范化设计虽然解决了未规范化关系模式带来的问题,但实际实现功能时会造成系统性能的下降,请解释其原因。
【问题3】
请解释逆规范化方法,说明其优缺点。
【问题4】
针对该信息系统中核心销售数据处理的特点,如采用关系表水平分割的逆规范化方法,请给出具体的解决方案,并说明该方案存在的问题。
参考答案
【问题1】
(1)数据冗余,关系模式中多次重复记录了同一供应商的地址。
(2)插入异常,如果还未确定一个供应商有哪些货物,只是想添加一个供应商的地址信息,则会产生产品与价格均为空的记录。
(3)修改异常,当修改一个供应商的地址时,需要将多条记录同时更新,若未同时更新,则数据产生不一致。
(4)删除异常,当删除一个供应商的货物时,其地址信息被一并删除。
【问题2】
数据库规范化的过程,实际是对数据表的不断拆分,以达到更高的规范程度。这样处理,带来的问题是:系统中大量查询不能通过单表完成,而需要将多表进行连接查询,所以表拆分得越多,查询性能也就越差。
【问题3】
规范化设计后,数据库设计者希望牺牲部分规范化来提高性能,这种从规范化设计的回退方法称为反规范化技术。
逆规范化方法优点:提高统计、查询效率。
逆规范化方法缺点:增加了数据冗余,浪费存储空间,增、删、改操作的效率降低,可能导致数据不一致,可能产生添加、修改、删除异常。
【问题4】
解决方案:将各省的数据存放于各省分公司。
该方案主要问题:
(1)在于总公司进行全国数据统计时,需要从各省服务器调取数据,效率较低。
(2)执行应用功能时需要动态选择分公司的数据库表,增加了应用程序的复杂度。
数据库性能优化
集中式数据库
- 硬件升级:处理器、内存、磁盘子系统和网络。
- 数据库设计:反规范化技术(逻辑)、数据库分区(物理)。
- 索引优化策略:选择经常查询不常更新的属性、数据量小的不设置索引等。
- 查询优化:建立物化视图或尽可能减少多表查询等。
分布式数据库
- 主从复制、读写分离
- 数据库分片(分表)、分库
- 分布式缓存技术