关闭

面向对象方法中的数据库设计

发表于:2010-10-27 10:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:coffeewoo(CSDNblog)    来源:51Testing软件测试网采编

  网友fdshxp问道:

  在软件开发时要进行数据库设计,现在通常的做法是需求分析,做数据流图,画ER图,这些显然是面向过程的东西,而在面向对象分析设计时,只是提数据库设计的内容,具体怎样做?虽然可以将数据库操作封装起来,但要设计的数据库表不能通过拍脑袋的方法获得,总不能再去画一遍数据流图吧!

  我回答:

  在面向对象中,是没有数据流这一说法的。业务的完成是由对象及消息来完成的,只有“对象流”,没有数据流。

  只是在现实中,绝大部分的对象持久化是用关系数据库实现的,我们还没有在性能上和查询上可以顶替关系数据库的对象数据库。设计数据库表的目的是不考虑所谓“流”的,考虑的是如何把对象高效的持久化。可以说,数据库设计和之前的面向对象设计是两个领域的问题,面向对象设计解决业务执行逻辑问题,数据库设计解决数据高效的问题(它根本不考虑流控制的概念),它们中间通过OR-mapping的机制结合起来。如果你对此一直有疑问,那说明你试图在设计数据库表时考虑通过数据库表设计表达业务逻辑问题,而不是考虑如何高效的持久化对象。

  假设,现在技术成熟到我们已经有性能不低于关系数据库的XML持久化机制和对象查询机制,任何对象都可以直接持久化而不需要OR-mapping,那么还需要设计数据库表么?

  网友fdshxp继续问道:

  谭老师,你好!很荣幸收到你的回信!

  你回信中说:面向对象设计解决业务执行逻辑问题,数据库设计解决数据高效的问题,说的真好。

  我的确是通过数据库表设计表达业务逻辑问题,因为在看许多数据库方面的书籍的时候,书上都是这么说的,例如人大的王珊教授的《数据库系统概论》中说:数据库设计是指对于一个给定的应用,构造优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。我的理解就像你所说的,通过数据库表设计表达业务逻辑问题,比如可以设置约束限制数据,通过触发器对相应的业务进行自动化处理。

  我在软件开发方面的学习可谓是一波三折,一开始,学习了C/C++,什么也不能做,后来接触VC++,由于其体系庞大,也没有做出什么来,转到VB、Delphi上,很轻松,做一个小的项目,看到VB和Delphi由于其和当今技术的差别,现转到.NET上来。(始终没敢转到JAVA上)

  正像你大象书中说的那样,我用面向对象纯粹是为了改进开发效率,通过封装、继承、多态等手段重构代码。进行数据库主要是为了存储业务数据,为了更好、更全面地管理业务,我按照数据库书上讲的,进行了面向过程的分析,画数据流图和数据字典,以求得对业务数据全方位的认知,接下来,整合业务数据画ER图,将其转化为数据库表。

  说实话,Hibernate的orm映射,我没用过。在进行面向对象分析和设计时,如果不用ORM,如何将数据库设计融入其中,我现在还是一头雾水。现在许多书上的做法是:先建立数据库表,然后将其封装,设计类。这种做法看起来很好。但是表是怎样推出来的,究竟设计几个表合适,还是不知道。

  通过谭老师你的书,我认识到设计的重要性,认识到编程的可推导性,从分析设计中推导出编码的要素。但是现在大部分的系统都需要数据库的支持,用数据库来存放业务数据。

  面向对象设计中,如何设计数据库的问题,请谭老师在不忙的情况下,给我一个设计程式。

  --------------------------------------------------------------------------------

  我想是时候谈谈面向对象数据库设计的一些想法了,在回答这位网友的同时更多的讲讲面向对象方法里如何设计数据库。

  首先想说的是面向过程的的数据流分析方法不是不正确,只是它不符合对象分析方法。两者的出发点是不同的,就象向两个不同方向前进的队伍,是无法调合的。而现在很普遍的所谓面向对象设计时“先建立数据库表,然后将其封装,设计类”则是彻头彻尾的错误! 套上一个面向对象的马甲,干的是完全不面向对象的事情。面向过程方法下的表设计还有数据流为推导,而这种伪对象方法为了穿上面向对象的画皮而抛弃了数据流的马甲,却又不按照对象分析方法行事,就更不知道数据库表是如何推导出来的了。

  运用最广的Hibernate在实际中有太多的误用,OR-mapping被仅仅当成数据库物理表和对象之间的简单一一对应,其本质还是先设计数据库再设计类。再强调一次“面向对象设计解决业务执行逻辑问题,数据库设计解决数据高效的问题”,它们本质上是两个领域的设计,只是由OR-mapping来连接它们。要采用面向对象方法,首先要忘记数据库的存在,采用对象分析方法,先把对象分析和定义出来,保证业务执行逻辑能够被这些对象很好的完成。达到这一点后,再来考虑对象持久化的问题。依据数据库的三大范式以及性能要求来把对象持久化。注意!!这时我们设计数据库要解决的问题是“对象数据高效持久化”,而不是业务逻辑!它不是从需求中推导出来的! 例如面向过程的设计中,一张申请表很可能被设计成一张物理表;而面向对象设计中,很可能没有申请表这么一张物理表,而只有“用户资料”、“申请流程”、“申请资质”等对象表,所谓的申请对象,是在运行期由这些对象聚合而成的。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号