如何将模型与数据库联系起来

08-09-15 flymouse
在jdon潜水也有一段时日了,但还是有个问题困扰着,就是:我们都说在分析阶段要与数据库隔离,而围绕领域模型,但是系统的数据最终还是要保存在数据库中,如果用hibernate映射来实现,应该怎么做呢?如果根据模型来设计表的字段,是不是有可能会造成数据的冗余呢?能否用个具体的例子说明一下,不知我表达得清不清楚

freebox
2008-09-16 01:39
根据领域模型造出来的db是不会存在冗余的,相反是因为太多的人认为为了提高性能,要违反什么什么范式来制造一些他们认为可以打破范式的冗余。
像论坛帖子的lastPostName,根据领域模型来说就是Post和User的多对一关系,Post里根本见不到lastPostName,那只不过是User里的username,然后根据post的时间找到最晚的那一个,但有些db设计者为了他们所说的性能会打破这个方式,造一个不知道是什么的lastPostName在post里,这就是冗余,范式不要冗余,是他破坏了范式自己造出来的。
下面是百度知道里找到的定义,也不知道我上面是不是理解错了。
第三范式:第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
设计那个lastPostName就明显违背这条,但领域模型满足了这条。

flymouse
2008-09-16 10:55
如此说来,是不是根据各个模型来对应建各个表,再根据模型间关系将各表之间联系起来,这样可以去掉一些多余的字段?我说的是在持久化方面的

freebox
2008-09-16 11:14
有了对象模型您为什么还要自己建表呢?我都不知道db里的表是怎么来的了,也从来不关心它有什么变化,只要知道有个数据源在jndi里就好了,其它的有autoddl来自动创建,建好对象模型之后交给hibernate管理就行了,再说也根本不用db自己来管理。

flymouse
2008-09-16 14:57
原来是这样,明白了,之前就是对这个问题感到困惑,真是谢谢了

leou2008
2008-09-17 10:18
>有了对象模型您为什么还要自己建表呢?我都不知道db里的表是怎么来的了,也从来不关心它有什么变化,只要知道有个数据源在jndi里就好了,其它的有autoddl来自动创建,建好对象模型之后交给Hibernate管理就行了,再说也根本不用db自己来管理。

free兄看来是大牛,很难想象你对数据库知识是不懂的,如果懂还是不要误导新的兄弟,基础数据库的知识我想还是一个基于数据库编程的人的根本知识体系之一,如果这样就是解决了冗余问题的话,确实是简单,我想你有时间也应该看看你管理的数据是何模样才行。

fox0424
2008-09-17 11:10
呵呵,从一个极端走向了另外一个极端

freebox
2008-09-17 12:55
我可不是什么大牛,小人物而已,况且我确实不懂数据库,只懂皮毛而已,很多概念都是听组里其他人讲的,所以说我误导别人确有可能,但绝对不是故意的,是我自己水平不够的缘故。新项目里的数据只有外键关联,是不存在概念冗余的。
05年末学习java,当时专做swing,之前没接触过任何编程语言除了html
06年发现swing市场不太景气,给人干活人家都找做web的,为了谋生转做web,第一个web应用是个留言本,jsp+servlet+文件存贮实现。大概是在那时候发现了文件存贮的缺点并发现了hibernate,于是快速学了一翻,当时记得还在用hbm.xml来配置,学习之后大喜,赶快把留言本应用改造成jsp+servlet+hibernate
07年学习设计模式至今,其间有一个应用是关于oracle的blob类型的,hibernate总出问题,学习sql就是从那时开始的,只是为了解决那个blob类型的问题。我的数据库知识就是这点而已,所以我也一直在说“以免误导他人”这句话,我只是发表自己的见解,不是在强迫别人接受或是给别人的思想定位。

maoone2003
2008-09-23 18:10
这个问题我也一直在思考,但是比如一开始使用领域对象把模型建立好了(需求分析、设计阶段);但是一旦需求发生变更怎么办,表里的数据怎么处理?
是不是说在需求分析、设计阶段可以这样去做,但是一旦到了编码、测试阶段发生需求变更或就只能手工维护了吧?
既然是这样我实在感觉不出来先设计数据库再生成对象与先构造对象在生成dll文件有什么区别,或许每个设计人员喜好不同,只要能达到目的并能够很好的按照规范及几个常用的范式去做就行了吧:)

[该贴被maoone2003于2008-09-23 18:11修改过]

fox0424
2008-09-23 19:21
http://www.jdon.com/article/34411.html

http://www.jdon.com/jivejdon/thread/34700.html

不同之处在于自上而下还是自下而上

banq
2008-09-24 15:57
>如果根据模型来设计表的字段,是不是有可能会造成数据的冗余呢?

我不知道你根据什么标准来判断冗余?模型就是业务对象客观事物,两者合二为一,如果客观事物什么样,模型就什么样,你和谁比冗余?

赶快擦干你脑子里那点数据库优先的潜意识,我知道完全抛弃以前知识是不容易,最好不要学习,我认为freebox就是一个很好说明,他的弱数据库背景使他接受对象思考和分析就很自然,可以看看他们的发言。

jackwang
2008-10-08 22:40
banq说的很有道理,以前的思维定势是很难改变的,就像很多人初次用TDD,感觉很理论很优雅,如得至宝似的。可一时间又是那样的不习惯,我看真正用 TDD 的朋友不多。对于数据库的知识,我想还是要学,而且要学精。最重要的是我们学会一种变通的思考方式。避免思维定势!