[Grails] grails Mapping Inheritance 问题
zllsdn
2008-10-21
Javabengou 写道 下次不做好人了
这年头做好人做不得 不好意思,我上个回复只是针对你说的鸡狼男女说的,因为你要知道一个求知者在询问的时候,最讨厌的就是听到与所问的问题基本上不沾边的话题。还有就是现在好人不多了,还是希望你做好人。 但对你刚才说说面向对象的设计类方法,我也表示赞同。 agile_boy 说的也非常对,面向对象的设计原则:优先使用组合,而不是继承。 问题是orm不光是对象的问题,他的底层是数据库,那是关系型的,合理的映射才能达到好的设计。hibernate基本上做到非常好了,他的映射规则很强大。不错哦,grails是在hibernate的基础之上的,但他的配置采用默认规则原则,不需要配置来达到一种制定规则的方法。映射文件和类文件是同一个东西,这才会让我来寻求一种适中的方法。 |
|
Javabengou
2008-10-21
先不说其他的,就针对你这个user,book来说
看你怎么定义,到底是一个user拥有n本book,还是其他的关联,如果按照你上面那种继承,就会多出一个表格。过度的使用继承和每个子类一个表(table-per-subclass)的映射策略,会导致过度使用连接查询,使得查询性能很差。通常我们建议保持简单,只有在你确实需要继承的时候才用它。 如果你只是想实现一个user拥有n本book,只要一对多就行了,就这么简单,如果使用多对多,记得加上belongsTo。 grails就是让你不用管底层数据,让你专心的做你的 |
|
agile_boy
2008-10-21
难得这样的帖子,
虽然现在grails好像不是很火,但是,我们这里的人,确实踏踏实实的在实践着! |
|
zllsdn
2008-10-22
我就称述一下我的观点,我所据的例子没有一点业务关系,user,book只是方便来分析问题(要提醒的是不是面向对象设计问题)
我们在搭建系统框架的时候,不是什么都想着面向对象吧,和业务没有关系的,你让他对象谁啊,那些createDate,updateDate ...都是和业务没有关系的,所以抽出来没有什么错,看就看你会不会抽,怎么做才算巧妙,grails也不是吧version,id,都抽出来了吗。 我现在就是在找,怎么把自己的共通属性加到模型中。当然每个类每个类的加没什么问题,而且像这些代码都是写生成工具生成的,也费不了多少事情,关键就是看起来不太爽,每个类里都有重复字段。 grails确实不需要我们去管数据库部分,但是现在是做项目,不是做玩具,你放心交个grails最起码要知道,他是怎么干的。 |
|
RayChase
2008-10-27
把父类写成abstract的,就没有三个表的问题了
|
|
zllsdn
2008-10-28
RayChase 写道 把父类写成abstract的,就没有三个表的问题了
这个怎么忘了 |
|
coolnight
2008-12-04
我也碰到这样的问题 实际上是这样的, gorm里面没有实现 hibernate inheritence 中的 table-per-concrete 模式。 楼主的设计当中把 User和 Book表共同继承了一个基类, 但是 如果问题变成 AdvanceUser 和 NormalUser 两个类继承BaseUser类呢? ok, 像这样的情况,又有人说了,你就用gorm里面提供的 table-per-subclass就ok了,尤其是 Javabengou 这样上来就质疑设计的。 实际上, 面对lagency系统的时候,不是你想怎样就怎样的。 就算是新设计系统, 像楼主这样设计也未必就不合理! 设计出BaseModel完全有可能是合理的,如果每个Model都继承BaseModel,而且有几十甚至几百个这样的Model的话! 这里的BaseModel就好象是java的Object一样是所有Model的父类有何不合理之处? 我们不是为了设计而设计, 而是为了解决问题而设计! |
|
coolnight
2008-12-04
把父类写成abstract是没有三个表的问题 但是会带来其他的问题 ms是这样 有待验证 zllsdn 写道 RayChase 写道 把父类写成abstract的,就没有三个表的问题了
这个怎么忘了 |