恐怕我认识的95%的搞软件的人,在开发一个项目的时候,都会费好大力气去做一个叫做“数据库”文档的东西。

里面使用了大量的表格,文字,等等,告诉用户:你看,我已经把系统的50%设计出来了!

可是,这真的是正确的吗?如果是正确的,为什么我发现90%的情况,这个文档竟然没有被同步更新?或者直到

项目 release 阶段,才会去最后更新一次这个文档?

我终于发现了答案:项目的设计阶段,把数据库扔在一边!

到今天我们已经达到一个共识,就是数据库的操作,其实就是数据持久的操作。什么是持久?就是把一个类里需要

的数据保存到磁盘上。你可以保存到文件里,可以保存到数据库里,这都是持久。

既然如此,那我们为什么还那么着急的确定数据库是什么样子?

我们只要设计出正确类,这个类能存储我们的数据就可以了!至于如何把这个类保存到磁盘上,或者如何从磁盘上

把这个类载入到内存里,那是另一个问题了。

很多人以为这是一个大问题,事实证明,只要你的类图设计的正确,那么持久层的处理与整个系统相比,实在是一件

小事情。而且在设计阶段不去考虑数据库因素,更有助于我们清晰的根据业务来设计系统。

那么有的人又说了,那我如何做单元测试,我可是 TDD 的!

我想,正是 TDD 导致了“把数据库扔在一边”的思维方式。你完全可以把数据库的操作做成一个接口,在单元测试的

时候,使用 mock 的方式。因为在实现业务的阶段,我们只考虑我们设计的类是不是能正确地保存数据,而不在乎它

到底是怎么保存到磁盘上的。

直到你确信业务逻辑正确,那么就可以去实现那个数据库操作的接口,去做真正的持久层。当然,这个名词叫facade模式。

而持久层是使用 hibernate,还是 ibatis ,那是另外一个问题了。如果你一定要说如果在业务逻辑里也有持久层的操作怎么

办,那我只能说你的业务逻辑类设计失败了!

不要在设计初期就费尽脑汁弄数据库设计了,把系统的类图设计正确,数据库也就是持久层的操作自然水到渠成了。

 

另外,有人可能会说,你这套在java里或许挺有价值,但是Rails呢? Agile dev with Rails 的作者可是一开始就设计了

数据库的草图。那是因为Rails的持久层实在是太容易了!Rails 里的model,其实就是业务逻辑的model,在设计的阶段,

你设计出了保存数据的类,那么这个类就可以作为model而存在,而针对这个model的逻辑就可以写在这里。

Agile dev with Rails 的作者虽然给我们画了数据库的草图,但我仍然认为他是从模型的角度去考虑问题,而不是从数据库

的角度考虑的。

评论
TK2006 2007-11-22
个人感觉数据库的改动的确非常麻烦,要改的东西太多了,配置文件,代码...
laorer 2007-10-19
设计经验不足,但需求的时候,会问客户相应的表的结构是不是那样.要不做不下去了
kava12 2007-08-08
我把10页看完了,证明我闲的慌~~

平时设计就是一会设计数据库表结构,一会研究类图。 改着改着差不多了就开始做,做着不顺了再改设计。然后项目就完工了。
chn217 2007-08-08
这个绝对是误解。

数据库的设计为什么要先行?其目的还是在于和客户的沟通。你可以把数据库当作是需求分析的一部分。你把数据库的设计文档给用户看,其目的就是为了验证你做的东西是否与客户的需求有偏差。

我个人认为,一个完整的数据库是一个项目成功的良好基础。虽然数据库会经常变化,但绝大多数都是细微变化。而且我们可以请客户来review这些变化。
eonhy 2007-08-08
yananay 写道

这就好像 Bob 大叔说过的一个例子,他们曾经发起过一个模型设计,
例子就是电灯的开关,结果有的人竟然设计出了电线这个对象。


如果本身就是对开关进行设计,为什么不可以有电线这个对象?
开关里面没有电线么?哦,你说的可能是普通的单刀单掷开关。。。。

电线的绝缘层厚度、耐压参数、阻燃特性
金属芯直径、材质、最高电流
blackanger 2007-08-06
ROR测试好像还离不开数据库吧
centgo 2007-08-03
引用
因为在我们设计数据库之前,肯定在头脑中有个对系统
大概的概念,例如订单,商品,用户等等。然后根据直觉或者经验来设计
出数据库。注意,这个过程其实就是先分析业务的过程,只不过是模糊的
分析,在设计完数据库后,然后反过来再看业务如何能按照数据库的设计走,发现走不下去了,再去修改数据库。如此反复。
既然需要如此反复,为什么不先把数据库放一边,把业务层弄明白呢??

为什么头脑中只是有个大概的概念?业务不熟啊!当然像你说的订单这样的业务,我相信这里绝大部分人都能看明白,完全可以按照你所说的做。
你可能又问把业务层弄明白呢??说的轻巧!小系统你可以说先把业务弄明白,像银行电信之类的系统等你全弄明白之后,可能业务需求早就变了!大型系统往往是螺旋,渐进,增量式开发,先有鸡还是先有蛋可能早就分不清了。
noble 2007-08-02
不同的行业、不同项目,有不同的特点,程咬金还要三板斧呢...
番茄有益 2007-07-31
lgx522 写道
弟兄们,信息系统搞久之后,你们早晚会发现还是要以DB为中心的,因为MIS说到底无非就是存储数据、传输数据、操作数据。
如果忽视DB,纯粹建立在OO上的空中楼阁是会很容易倒掉的。
本人用了不少的ORM,最后发现还是SQL管用。


我太同意这位同学了,花花肠子搞多了,发现直截了当才真的很爽。

况且管他什么数据库为中心还是什么DDD的,关键是要解决业务,业务需求。
你去给客户说,我的系统采用了宇宙无敌开发法,具有你能想到的所有功能,可以胜任任何情况的变化。对方一定会买你的帐么。
lgx522 2007-07-23
最近维护一个老掉牙系统,发点感触。
起因是那个系统数据库设计得实在太烂,范式基本不满足,也不符合OOP,本人建议,更换!

其实不论是对象建模还是数据建模,最终的成果都差不多。大家不信可以让同样老道的DBA和UML分析员,分别对同一系统建模,最后是相差不多的,所谓“英雄所见略同”说得就是这回事。原因在于DBA同样要考虑数据的结构合不合理,而UML分析员最后也要考虑效率高不高,最后的折衷结果大体相似。
本人因历史原因,一开始做了很多的数据建模。眼下虽然也OOP、ORM,但UML用的不熟,故基本上还是选择顺手的数据库建模,好在与OOP结合得还算不错。所以习惯数据库建模的老同道们大可不必担心。

多点废话,个人体会数据库建模更简单、直接。如果各位同道经过尝试仍不习惯UML建模(像本人),那么数据库建模又有何妨?
leapahead 2007-07-18
正规的开发过程都是先业务逻辑模型,再物理模型。工程都这样的啊。难道楼主不是吗
billchang010 2007-07-13
oo的设计领域模型主导设计确实比设计数据库重要得多,对于整个设计过程可以不去考虑数据库。经验不多,个人认识而已。
dawnzhang 2007-07-13
LZ见解的底气来自ORM,确实有了这么一层之后,大家只需要关注实体类设计就可以了,但效率问题需要考虑.
strangecat2005 2007-07-12
lgx522 写道
弟兄们,信息系统搞久之后,你们早晚会发现还是要以DB为中心的,因为MIS说到底无非就是存储数据、传输数据、操作数据。
如果忽视DB,纯粹建立在OO上的空中楼阁是会很容易倒掉的。
本人用了不少的ORM,最后发现还是SQL管用。


这话我严重同意。

经常发现在一个系统上线后几年,没人管程序怎么样,多数都是问如何把数据库里的数据提取出来。最后,系统技术文档中的类图什么的都是摆设--大家宁可看源代码,而数据库的模型反而成了最主要的东西了--大家都要这个文档。
hx9999 2007-07-11
呵呵,同意楼上的,经常是鸡同鸭讲,不要再讨论了。
jackyz 2007-07-11
哈哈,看完全部回复,我的收获是——老婆常报怨我“你们搞程序的,是不是都是一根筋啊”——似乎还真有这么点意思。

引用
a说了观点1.1,
b理解为观点1.2,反驳a,祭出观点2.1,
c理解a的为观点1.3,同意a,反驳b,提出的是1.4,
d来掺合,宣传他的观点3.1,
e出来说话,ab各打50大板,提倡大家和谐社会,
……鸡同鸭讲[无恶意的广东方言]怎一个乱字了得~。


鄙视自己一下,8页回帖全看完,真是闲的。
winhkey 2007-07-11
而目前客户大部分都会选择数据库来存储数据
winhkey 2007-07-11
一口气看了这么多页,说实在的还是比较认同楼主的思想,不过帖子的标题取的不好,《把数据库扔一边》,和楼主要表达的把数据库设计延后一点是两个意思,后面相当一部分提出不同见解的人说的话我感觉其实都是奔这个标题去的。
数据库的重要性谁也抹杀不了,对于客户来说,数据才是最重要的。
lgx522 2007-07-10
弟兄们,信息系统搞久之后,你们早晚会发现还是要以DB为中心的,因为MIS说到底无非就是存储数据、传输数据、操作数据。
如果忽视DB,纯粹建立在OO上的空中楼阁是会很容易倒掉的。
本人用了不少的ORM,最后发现还是SQL管用。
gfh21cn 2007-07-09
我也认为数据库设计应该滞后一些
优先把功能设计好,数据库和算法是功能设计的衍生
yananay
搜索本博客
我的相册
D35bafa8-5bf0-475f-aa06-16f3080557a1-thumb
tdd
共 3 张
存档
最新评论