如何做数据库设计,架构师的必备技能之一(C系架构设计法)

一:数据库设计的地位

从前地位尊崇,早期的信息系统设计,主要就是在做数据库设计。

现状:大型分布式系统、面向对象编程,数据库演变为从属地位,不过就是一个存放数据的地方,现在选择很多:分布式文件系统、内存数据库、Nosql数据库,都在动摇传统关系数据库的地位。

但并不是说数据库设计就不重要了,设计合理的、精巧的数据存储结构,对于系统的性能、功能的实现等还是非常有帮助的,优秀的数据库设计带来如下好处:

1:简化应用的开发难度,缩短开发周期

2:节约存储空间

3:提升系统性能

4:提高系统的可靠性、可维护性和灵活性

所以还是有必要来好好看一下数据库设计的基本步骤和基本方法。

 

二:数据库的设计步骤

一起看看有名的新奥尔良法(New Orleans),主张把数据库的设计分为需求分析(分析用户需求)、概念设计(信息和定义)、逻辑设计(实现设计)和物理设计(结构设计)四个阶段。

1:需求分析

主要是跟数据库相关的一些分析,包括业务范围、关系、数据项及取值范围、引用关系、处理逻辑、边界值和边界条件等等

在实践过程中,我们通常会把这个过程放到前面讲的需求调研和需求分析阶段去完成,在需求调研阶段找用户去收集这些实体信息,需求分析阶段,不仅仅是分析业务,也会分析出这些实体对象、属性、关系等内容来。

2:概念设计

一般来说是独立于DBMS的概念模型,主要用来反映实体之间的关系,通常我们会把它抽象成E-R图来表达。

3:逻辑设计

即业务处理模型,设计逻辑处理流程、单元,同时把概念设计阶段的概念模型,转化成为关系型数据库的关系模型,从而形成需要特定DBMS支持的数据模型。

以前这个过程非常重要,现在已经大大弱化了,因为很多跟业务逻辑、数据逻辑相关的内容,都放到应用程序那边去设计了,数据库就退化成为数据存储的地方,尽量不在数据库里面去做逻辑处理流程或逻辑单元了。

4:物理设计

基于逻辑模型设计存储结构和存储方法,形成数据库物理模型和脚本,并初始化基础支撑数据。

也就是常见的设计表、视图、索引等的过程。

在这些步骤的基础上,我们再增加一个步骤:

5:验证设计

基于逻辑模型和物理模型,根据逻辑模型各种业务规则,准备验证数据,测试各种常规流程和边界条件及并发、集成测试模式,往往与开发同步。

比如在开发期间,发现存放数据的表结构不合适,表之间的关系不合适,韩简单,那就逐步调整和完善。

实际上,在实践过程中,最有用的就是:物理设计,其次是概念设计,下面我们分别来看一下。

 

三:概念设计

概念数据模型是面向用户、面向现实世界的数据模型,是与DBMS无关的。通常是抽象需求分析阶段的用户需求,并且脱离DBMS,转为反映现实世界业务的信息结构,一般以E-R图或PD绘制CDM(概念数据模型)图。

概念设计模型中最重要的是要体现清楚实体关系

概念设计模型为物理模型的设计提供了基础依据。

概念设计的现状,是在不断退化,在实践中,通常是:

1:辅助我们去思考、理解和分析重难点的实体及其关系

大多数情况下,都是用来辅助思考和加深对重难点部分的数据关系的理解和分析。这也意味着我们无需把所有的实体及其关系都分析出来,不用做那么完整。

2:弱化逻辑设计阶段

原本 概念设计阶段过后,应该是逻辑设计阶段,会在这个阶段,把概念数据模型转换为关系数据模型,并进行基本的优化,比如:要符合三范式的要求等等。

现在统统直接放到物理设计阶段了。

 

四:物理设计

数据库的物理设计阶段就是来确定数据库的物理结构,然后从响应性能、存储容量和存储方法等角度进行评价,并优化设计。

1:确定物理结构,主要是:

(1)表结构:字段、类型、长度、取值范围、是否唯一、是否为空、是否主键等等

(2)索引:索引类型、单字段、组合索引、索引的顺序等

(3)主外键关系:1:1,1:多,多对对;主键方面要考虑是单主键还是多个字段的复合主键等

2:确定数据的存储结构:确定要存储的内容

(1)确定数据的存放位置和存储结构,一般包括关系、索引、聚簇、日志、备份等。

(2)确定系统配置,一般包括存取时间、存储空间利用率、维护代价,这三个方面常常是相互矛盾的

如:消除一切冗余数据虽能够节约存储空间和减少维护代价,但往往会导致检索代价的增加,所以必须进行权衡,选择一个折中方案

3:确定数据的存储结构的基本原则

(1)易变部分与稳定部分分开存放

(2)存取频率较高部分与存取频率较低部分,分开存放

比如数据库数据备份、日志文件备份等由于只在故障恢复时才使用,而且数据量很大,可以考虑存放在磁带上

如果计算机有多个磁盘或磁盘阵列,可以考虑将表和索引分别放在不同的磁盘上,在查询时,由于磁盘驱动器并行工作,可以提高物理I/O读写的效率

也可以将比较大的表分别放在两个磁盘上,以加快存取速度,这在多用户环境下特别有效

还可以将日志文件与数据库对象(表、索引等)放在不同的磁盘以改进系统的性能

五:其它需要考虑的

1:是否需要做适当的冗余

尤其是在大型分布式系统中,分成很多数据库,如果是微服务体系,可能每个微服务都有自己对应的数据库。

这种情况下,有些数据做一些适当的冗余,会大大减少跨库获取数据的需要,也能大大提升应用性能。

因此,虽然冗余是不满足数据库范式的,但设计就是要综合权衡,在有必要的情况下,可以考虑适当做一些数据冗余。当然对于冗余数据的一个挑战是如何同步更新这些数据,要设计好哦。

2:考虑使用Nosql

比如:Redis、MongoDB、ElasticSearch、HBase等。

当然要结合具体应用的情况,还有这些Nosql的特点和适用场景,选择合适的方案。

3:数据库优化

比如:MySQL服务器配置优化、sql优化、主从复制、读写分离、数据表分区、数据库拆分、分库分表、数据库集群等等

当然:数据库设计、尤其是数据库优化,是一个很大的话题,更多的这里就不去展开了,这里重在学习方法和思路。

关于如何做数据库设计,先就简单的聊到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码快撩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值