灵活运用数据库主外键
在最近的工作中发现,公司现有表都是没有主外键关系的,也就是没有加数据库主外键约束,全部都是采用程序来控制数据的一致性。这点让我很是不解,从当初学习数据库,到参加工作使用数据库和设计数据库,一直都遵循数据库的三范式,表之间的关联采用数据库的主外键约束(请理解这是数据库的约束,而不是我们程序控制的约束)。于是查找了一些资料,现在的疑惑才慢慢解开。下面我将对数据库的作用,以及为什么出现应用程序,再到真正开发时如何设计数据库的一些理解和大家分享下,欢迎提出不同的见解。
数据库是什么
数据库,是计算机中运行的一个进程,它可以完成数据存储,查找,分析,数据挖掘等我们通常使用的功能(大家可以联想access数据库),只是其操作起来对人员的要求较高,必须要懂得sql语句的写法,深刻理解表之间的关系,当然也可以请专门的人员来帮忙将数据导出来,这样的工作实施起来麻烦还是比较大的。并不是每个人都懂sql语法,专门的人员(DBA)一般公司请不起,简单的操作人员,工作效率是个问题。数据库的功能是强大,但是面向的人群较为苛刻。所以在我的思维习惯中,数据库往往是一种后台的服务(不直接操作它,但是使用其提供的服务,sql语句就是它提供的接口),不过现在不能再这么认为了,我们可以仅仅利用数据库各种数据的操作,比如数据的录入,数据的分析等,但是这样的效率太低了,如果每天有上千条的数据(这里说少点)需要保持,那么单纯来使用数据库这将是一项浩大的工程,分析也一样,而且分析得出的数据用户不一定能看懂。于是有了我们的应用程序。
数据库之上的应用系统
如果单从数据库应用程序的角度来考虑,而不谈其它应用系统,其作用可以为我们提供一个透明的简单的数据录入,查询和分析。用户只需要点击某一个按钮就可以得到想要的结果。而且其面向的人群更大众化,正是有这样的特性,才使计算机真正的为更多人服务,用户完全可以认为不存在数据库,无论是网上购物,还是自己的数据备忘,抑或是分析最近关注信息的走势,都是一个按钮解决问题。再回到技术上,系统要想做到方便用户使用,到底应该怎么做?
需要知道的两个概念
OLAP和OLTP。一个是联机分析处理,一个是联机事务处理。联机分析强调的是数据查询和整合分析,数据修改较少,而联机事务则强调数据修改较多,对数据一致性要求较高。这就对应着两个系统,一个系统对查询的性能要求很高,方便数据的可移植,一个系统对数据完整性和一致性要求较高。因此我们在做系统设计时必须搞清楚系统的特性,如果是查询性能高而且数据结构的修改较多,数据移植频繁,那么在数据库的设计时就不能完全遵循三范式,因为这样数据库会有一定的自检策略而且比较豪性能,相反则更能很好的保证数据的正确性。
结论
知识还是要灵活运用的,范式在数据库中是真理,但是当和其它系统集成的时候就不一定完全合理,比如数据的冗余,如果经常做统计查询,那么将统计结果放到一张表中比关联几张表来查询快多了,而且用户看中的就是这个,其它让我们大胆相信自己的程序能够控制后,做好数据准确的把门将军。让数据库的最后一道关用在其它地方吧。
====================================分割线================================
最新内容请见作者的GitHub页:http://qaseven.github.io/