[Database] 有效数据库设计的目标

理解设计的重要性

设计是良好开发的前提和基础,就如同建造摩天大厦,永远不可能一上来就垒砖砌瓦,优秀的建筑师必定要先做出一份详细可靠的设计图纸,建筑工人再照此开工,从而平地起高楼,大厦入汉霄。
一个软件的底层设计如果存在瑕疵,那么整个系统就将存在潜在的危机,而且时间越长,问题可能越根深蒂固,难以改正,随着开发的持续进行,为了修正最终设计存在的问题所需付出的代价可能也会越来越大,甚至需要推翻所有重新来过,这对无论是管理者还是开发者来说都是极其痛苦的。
另一方面,一个有趣的例子是,项目经理发现使用当前的技术和设计不能使将来的项目可靠运行,从而向上层领导提交这一建议,但结果却是他被开除了;然而新来的项目经理也发现了同样的问题,和上层领导反映时也同样被开除;如此往复,看似上层领导不关心技术或设计细节,认为不能实现是个人能力问题。解决问题的唯一方法只能是上层领导自己意识到错误并抛弃整个项目,重新设计。
数据库设计也不例外,一个有问题的数据库设计会导致整个项目的失败,可能会导致诸多问题,无论项目的其他部分设计得多么完美,整个系统终会崩溃。

数据库的定义

显示当中有很多数据容器,书本,衣柜,邮箱甚至你的大脑,他们都存储有一定的信息或者数据,虽然形式不同,但具有一些相似性,都存储(Stores)着一些东西,你可以取出(Read)这些东西,再放入或者修改(Update)一些东西,甚至可以删除(Delete)一些东西。这些性质也便是数据库最基本的含义:

A database is a tool that stores data, and let you create, read, update and delete data in some manner.

理想数据库的特性

不过书本,衣柜,邮箱甚至大脑都不能称之为我们所认为的数据库(Database),一个理想的数据库除了具有上述的基本功能,还需要具有一些必不可少的特性,比如持久、一致、安全、可用、可扩展、快等等。

CRUD

Create(C),Read(R),Update(U),Delete(D)。是四个理想数据库所需具备的基本特性。这意味着你可以安全可靠,快捷一致地在数据库中创建(Create),读取(Read),更新(Update)和删除(Delete)数据。

Retrieval

Retrieval 是 “read” 的同义词,可获取不仅仅意味着可读性。首先要保证你可以找到所有数据,不能你插入了但是读不到,无故丢失。
另外你可以组织数据格式,从而可以使用多种特定的方式来读取他们,比如通过用户ID或者用户姓名来读取用户的地址,需要用户选取合适的方式读取数据。
读取应该快速,方便,读出的数据应该可靠一致。

Consistency

CRUD 的 “R” 的另一个方面是 consistency,一致性。这意味着你执行多次相同的查询,数据库返回的结果应该是一样的,其他用户执行相同的查询,得到的结果也是一样的(前提是所读取的数据没有被修改)。
一个良好的数据库产品可以为数据一致性提供技术保证和底层支持,但是不当的数据库设计也有可能会导致数据不一致的问题,比如你在用户信息表中保存有用户联系信息,但却在订单表中保存了冲突的用户联系信息,那么当你需要联系用户时,选择哪个联系信息便存在问题。

Validity

Validity 和 consistency 相近,正确性意味着数据应该被验证(Verify),其中的一个方面就是是否和数据库中的其他数据存在冲突或不一致。
数据库可以容易地验证数据是否有正确的类型。比如日期格式不能输入字符串。
数据库也可以验证一个用户输入的值存在于数据库中的其他位置。比如城市字段应该只能输入在城市表中存在的合法城市。
数据库也可以检查数据的某些状态。比如用户请求转出100元钱,数据库能够检查账户余额是否够这么多钱并做出允许或者拒绝的操作。
数据库能够保证不允许错误的改变,比如要删除一个城市,那么数据库会检测这个城市下是否还存在用户,如果存在,那么只有删除所有用户,才能够删除城市。

Easy Error Correction

容易的错误改正在计算机的数据库内是内置支持的功能,例如你可以轻松地修改订单的错误拼写的产品名称,但是为了能够从这一功能中获得最大益处,你需要良好地设计,比如选择合适的数据存储格式从而可以更快更有效地修改数据。

Speed

数据库的速度非常重要,一个设计优良的数据库可以快速地创建、读取、更新和删除数据。

Atomic Transactions

原子事务指的是一系列可能的复杂动作,而在其他事务看来是单一操作。比如你将100元从Alice的账户转移到Bob的账户,没有其他事物可以看到数据库处于钱从Alice的账户移出但却还没有加入到Bob的账户的中间状态。
原子事务要么全部完成,要么全部失败,不能发生一半。
原子事务对于保证一致性和正确性相当重要,因此也对 CRUD 的 R 和 U 非常重要。

ACID

这个部分进一步介绍原子事物的细节而不是数据库的特色。
ACID 是一个有效的事务系统所应该提供的四个特性的首字母缩写:Atomicity(原子性),Consistency(一致性),Isolation(隔离性)和 Durability(持久性)。
原子性指的是事务应该是原子的,要么全部成功,要么全部失败。
一致性意味着事务要确保数据库在事务前后能够都处于一致的状态,换句话说,如果事务中的某些操作违反数据库的规则,那么事务就要全部回滚(Rollback),好像糟糕的事务从未发生过一样。
隔离性意味着一个事务的细节对于其他所有事务来说都是不可见的,其他事务看不到自己的中间状态,而只能看到事务开始前或提交后的状态。

  • 当两个事务操作相同的数据时,事务发生的顺序可能会对两个事务的成功与否产生重大影响。数据库不能保证两个事务的发生顺序,但是可以保证当一个事务提交或回滚之后,再开始另一个事务。

持久性意味着一旦事务被提交,它所造成的结果就不会在之后消失,就算断电重启,事务的影响依然存在。

  • 一个高端数据库可能通过提供持续映射(shadowing)来提供持久性。每个数据库操作发生,它都被映射到另一个系统。如果主系统故障,映射数据库可以立即开始服务。
  • 其他数据库通过日志来提供持久性,数据库每执行一项操作,他就在日志中记录操作。当数据库故障后重启时,他可以重载上次保存的数据,从日志中重新应用所有的操作。它比从映射数据库重启耗时,但消耗更多的资源,成本也更低。

数据库为了提供持久性,只有事务的改变被映射或者记录到日志中,否则不能认为事务成功提交。
事务一旦被提交,它便结束。

Persistence and Backups

数据必须是持久的,不能自己改变或者消失。
数据库产品尽己所能保证数据的安全。但是对于突发意外情况,用户必须自己想办法处理,比如磁盘损坏,发生火灾,或者人为删除。在这些情况下,数据库无法帮你,你需要进行常规的备份。
如果少量的数据损失对你的影响不大,你可以每日备份,并在事故后一两个小时进行还原。
但如果数据库非常易变而且少量的数据损失会造成很大的问题,比如纽约交易所的股票交易,这显然需要不同的备份策略。一些高端数据库产品允许你使用映射(shadow)每个发生的数据库操作,所以你能够得到一切所发生事务的完整拷贝,并在几分钟内恢复。一些数据库甚至可以在主库故障时直接切换备库,用户感觉不到发生了什么。

Low Cost and Extensibility

理想的数据库应该是容易获取和安装,廉价并且可扩容的。有一天希望增加数据库容量的要求显然非常正常。
花费和容量更多的是数据库的特点而不是数据库设计,不过良好的设计有助于可延展性。比如增加某些表来增加数据库的功能。

Easy of Use

对于程序员或者相关的数据库使用者来说,好的数据库设计也意味着数据库容易理解和使用,这包括可读性高的表名,字段名和其他数据库实体。易于理解的结构和数据可以使程序员更容易地进行开发。

Portability

便携性,计算机数据库具有比笔记本更强大的便携性,通过网络,你可以随时随地远程访问你的数据库,不管相距多远。但另一方面,这种便携性也会导致安全性的问题。

Security

你可以在世界各地访问你的数据库,黑客当然也可以。
数据库安全性有赖于网络安全和数据库工具本身的安全机制。
你可以将数据分类,将对数据的访问划分权限,并给予相应的用户,这不仅可以降低某些用户误操作自己无权访问的数据的可能性,而且也会降低黑客冒充某一用户对数据库其他数据的破坏的可能性。

Sharing

现代网络允许成百上千的用户从不同地方同时访问同一数据库,获得相同的信息。
通过对数据库用户进行访问权限的控制,也可以降低网络中传输的数据量。
合理地组织数据也可以确保用户修改某些数据时,尽量只有必须的少量数据被锁定,而可以有更多的其他数据可以被别的用户修改。
良好的设计也可以允许数据库进行一些计算,只发送所需的计算结果而不是所有的数据。

Ability to Perform Complex Calculations

计算机执行有限地、有规则的、重复性地计算任务可以比人脑更加快速和可靠,并且不会厌烦,能够不断重复执行。在硬件和程序正常的情况下,可以出色地完成各种计算任务。数据库支持进行某些计算,但这也依赖于良好地数据库设计,否则你根本就无法获取所需要的数据来进行计算。

参考资料

[1] Stephens R. Beginning Database Design Solutions[M]. Wiley Publishing, 2008.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值