数据库设计


数据库设计
数据库逻辑设计
数据库物理设计
数据库维护和优化

为什么要进行数据库设计

谈到数据库设计首先要弄明白什么是“数据库设计”,我们可以打一个不太恰当的比喻:把数据库应用程序的设计看作是在建立一座大厦,那么建立大厦之前通常要对大厦的整体结构进行设计,并且汇聚成图纸然后应对图纸再对大厦进行施工,那么数据库设计的过程就相当于是我们建造大厦的过程。首先我们也要对数据库的整体结构进行图形化的设计,然后再根据图形来对数据库结构进行建立。那么简单来说:
数据库设计就是根据业务系统的具体需求结合我们所选的DBMS(数据库管理系统),为这个业务系统构造出最优的数据库存储模型,并建立好数据库中的表结构及表与表之间的关联关系的过程。使之能有效的对应系统中的数据进行存储,并可以高效的的对已经存储的数据进行访问。

常用的数据库管理系统有:MySQL、Oracle、SQLServer、Pgsql这些都是目前主流的关系性数据库系统
已经现在流行的NoSQL系统:Mongo、Memcache、Redis

注意,我们要达到的目的是对数据有效的存储以及高效的访问。那么应用系统中所产生的数据有多种的存储方式。首先我们可以把所有的数据都存储在同一张表中,虽然说这样达到了存储的目的但是却不一定能达到高效访问的目的。

好的数据库设计对比糟糕的数据库设计

一个优良的数据库设计:
1)可以减少数据冗余
2)避免数据维护异常
3)节约存储空间
4)高效的访问
反之一个糟糕的数据库设计:
1)会存在大量数据冗余
2)存在数据插入,更新,删除的异常
3)浪费大量存储空间
4)访问数据低效

数据库系统是应用系统存储数据的关键组成部分,是系统稳定运行的基础,决定着系统是否可以高效稳定的运行,还以刚才大厦的例子来说,我们的数据库就相当于是这个大厦的地基,如果大厦的地基可以稳固,那么大厦就可以建的很高,如果地基没有建好那么大厦就很容易倒塌,同样如果数据库没有设计好的话那么系统就不会太稳定。这种情况可能在最终我们系统访问量很小数据也不多的情况下不明显,但是随着我们数据库的数据越来越多访问量的越来越大,那么这种数据库设计的缺陷就会显现出来。
例如一家初创企业,在初创期开发人员并不多并且也没有在专业的DBA,这样他们所设计的数据库仅仅是以存储数据为目的,达到数据存储后就没有进一步进行调优,这就会使得这家企业业务发展起来的时候,数量非常大的时候就会在一些比较重要的促销时经常会出现系统死机的情况,这不但影响的公司业务的正常运行,并且对今后的开发也在造成的非常大的影响。所以说我们很有必要在系统设计的开始就对数据库进行一个良好的设计,这样不但对系统稳定带来好处,并且对今后的维护开发已经业务运行都有非常大的好处。

数据库设计步骤

如果你在工作中要对一些慢查询进行调优工作,但是慢查询是由于数据库结构设计的不合理产生的。那么我们进行慢查询调整的时候就必然要对数据库的结构进行调整,而当我们的数据库已经在生产环境运行了一段时间的话,我们要再想对数据库结构进行调整就必然会影响业务的正常运行,这是谁都不希望看到的,所以我们很有必要在数据库设计的最终就把数据库设计成一个简洁高效的数据库结构。

数据库设计的步骤:
需求分析->逻辑设计->物理设计->维护优化

和应用程序设计一样,数据库设计最初也要进行需求分析,只不过数据库的需求分析和应用程序的需求分析侧重点不太一样。数据库设计的需求分析的侧重点主要是:
应用主要在数据库中存储的数据是什么?而这些数据又有哪些属性?这些数据和属性各自的特点又有那些?

我们只要了解这些东西,那么就对我们后边的数据库设计有非常大的帮助

需求分析之后是逻辑设计,在逻辑中我们主要是通过ER图这种工具对数据库进行逻辑建模。这个逻辑建模之所以叫逻辑建模就是因为他跟我们所选的具体的具体数据库管理系统是没有关系的,我们进行逻辑建模之后是可以在大多数数据库管理系统中在进行表结构的设计的。

逻辑设计后就是物理设计了,在物理设计中我们就要区考虑我们使用的数据库管理系统是什么。因为就目前来说我们常用的数据库管理系统如,MySQL、Oracle、SQLServer、Pgsql这几种数据库系统他们
每一种都有自身的特点,而我们为了把数据库管理系统的效率发挥到最高,那么我们在进行物理设计的时候就要充分的考虑到每一种数据库管理系统具体的特点是什么,这个时候在把逻辑设计中所建立的逻辑模型转换为我们需要的物理模型,这样我们就可以达到数据库效率的最优化。

物理设计之后就是维护和优化,在维护和优化过程中我们要对新的需求进行表结构的建立或者索引的优化在或者是数据量大到一定程度的时候我们可能要考虑表的拆分。但是在维护和优化中有一个非常重要的地方需要在注意,就是说在最初我们应用上线的在最开始我们的数据库设计是非常完美的,非常简洁也非常高效,但是当需求不断的累加,在时候在后面的开发过程中我们就不注意数据库的设计问题,这样随着应用程序上线的时间越来久需求累加越来越多,我们应用数据库结构也会越来越复杂,这些都属于维护优化工作没有做好的原因。所以在维护优化过程中也要注意,当接到新的需求的时候也要通过以上需求分析、逻辑分析、物理设计这几步,完成之后在进行具体的建表工作,在这样可以就可以保证数据库结构永远是最优的。

为什么要进行需求分析

实际工作中一些开发人员都是拿到一个需求之后并不会进行需求分析而是直接进行表结构设计。往往这样设计出的数据库并不会在最优化的。所以有必要在数据库之前进行需求分析。

在需求分析中我们要先搞清楚:

在这个系统中我们所存储的数据有哪些?
这些数据又有什么样的特点?
比如说,有些数据是具有时效性的而有些数据是不具有时效性的。对于一些时效性的数据可以采取过期清理或者归档的方式来进行存储。
了解数据的生命周期
还有一些数据增长很快数据量也很大,但是这些数据并不是核心数据,对于这些数据我们也可以进行分库分表的方式进行存储。在实际工作中一些开发人员希望把一些日志类的数据存到数据库中,以DBA的角度来看这种数据是非常不是和存储在数据库中的,首先是因为这种数据增长量非常大,并且并不属于核心数据,所以对于这种数据如果一定要存储到数据库中,可以在进行数据库存储之前可以先定义好这种数据的归档或者清理规则,这样可以随着数据库上线就可以进行数据的归档和清理,如果当这个表増长的非常大的时候在进行归档和清理的时候一定工作量非常大,并且很有可能影响线上的正常使用。

在需求分析中要搞清楚的一些问题

在需求分析中首先要搞清楚要在数据库中存储的对象都有什么?
这些对象也可以称之为实体。实体及实体之间的关系?
实体和数据库表之间的关系是并不是一一对应的而是可以1对1,1对多,多对多,实体之间的关系也是如此
实体所包含的属性有什么?
这些属性也有各自的特点,比如说那些属性是可以标识出这些实体的,
哪些属性或组合可以唯一标识一个实体?
那个标识出实体的属性可能是一个也可能是多个或者是多种组合来标识这个实体。具体选用哪一种是需要我们在逻辑设计中考虑的问题,但是在需求分析的时候我们就要把这些属性和属性组合搞清楚。
清楚实体所包含的属性之后还要了解出实体的一些特性,比如在存储上有什么样的特性,增长量会是什么样?就比如对一些日志类的实体
可能增长比较快,对于这些实体我们就要考虑分库分表的操作或者是按时进行归档,这些内容是我们要在物理设计中考虑的,但是如果在需求分析中没有把这些搞清楚的话,在在物理设计和逻辑设计中就很难对数据库进行分库分表的设计或者归档的设计

实例演示

以一个小型的电子商务网站为例,在这个电子商务网站的系统中包括了几个核心模块:用户模块,商品模块,订单模块,购物车模块,供应商模块。

用户模块主要用于用户登录和保存用户注册信息
包括属性:用户名 、密码、电话、邮箱、身份证号、地址、姓名、昵称……
可选唯一标识属性:用户名、身份证、电话
存储特点:随着系统上线时间逐渐增加,需要永久存储,这就要求在物理设计中考虑对用户模块是否要分库分表的问题

商品模块用于记录网站中所销售的商品信息
包括属性:商品编码、商品名称、商品描述、商品品类、供应商名称、重量、有效期、价格……
可选唯一标识属性:(商品名称、供应商名称)、(商品编码)
因为一个供应商可能对我们提供多个商品,同时也有可能一个商品由多个供应商提供,所以商品名称和供应商名称的组合才能唯一标识出哪一个供应商提供的哪一个商品
存储特点:随着网站经营时间的增长,商品也会越来越多,但是对于某一个供应商的商品来说,如果这个供应商已经不再对我们提供供应的话,对于这些商品我们实际上可以进行一些归档的存储。但是,切记这些商品是不能删除的,因为有可能还会和订单模块相关,所以这些商品是需要永久存储,但是可以对一些不再销售的商品进行一些迁移工作(先迁移到其他表中)这样对我们商品表可以保持一个比较小的数量级,能对搜索查询的效率带来好处

订单模块用于存储用户订购商品的信息
因为订单是属于用户的所以要包括:订单号、用户姓名、用户电话、收货地址、商品编号、商品名称、数量、价格、订单状态、支付状态、订单类型……
可选唯一标识属性:(订单号)(用户命名、商品、下单日期)
存储特点:随着经营的增长订单表数据会越来越多,订单表需要永久存储,并且很多用户需要查询历史订单记录,所以订单表的查询频率会非常大,所以要考虑分表或者分库的操作

购物车模块用于存储用户选购的商品信息
包括属性:用户名、商品编号、商品名称、商品价格、商品描述、商品分类、加入时间、商品数量……
可选唯一标识:(用户名、商品编号、加入时间)、(购物车编号)
存储特点:不用永久存储(设置归档、清理规则),购物车的数据有一定的实效性,比如半年内没有被购买的数据进行一些清理操作

供应商模块用于保存所销售商品的供应商信息
包括属性:供应商编号、供应商名称、联系人、电话、营业执照号、地质、法人……
可选唯一标识:(供应商编号)(营业执照号)
存储特点:永久存储,供应商的数量不会特别多,所以不需要什么策略”


文章作者: 拾年
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 拾年 !
评论
 上一篇
解决博客访问次数不正确问题 解决博客访问次数不正确问题
一次无意间通过百度搜索自己的博客,点进去后发现博客的访问数量不对,仔细观察发现百度给我快照的是https://www.chenxinshinian.com 而我平时都是习惯使用 https://chenxinshinian.com这样该是
2020-05-14
下一篇 
数据库维护和优化 数据库维护和优化
数据库设计数据库逻辑设计数据库物理设计数据库维护和优化 由于项目中需求是不断变化的,所以数据库中的结构也是需要不断的做相应的改变 维护和优化中要做什么1)维护数据字典 数据字典对于应用是否便于维护是非常重要的,如果我们不清楚表中每一个列或
2020-05-11
  目录