该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-29
程序员杂志上提到过一个叫做COID的技术,用于多态关联应该比较合适,而且适应性很广,因为它本身是数据模式设计的增强而不是ORM的功能。
|
|
返回顶楼 | |
发表时间:2007-05-31
"""
原来RoR的多态关联跟Gavin King polymorphic associations的提法还是有不小差别的,从这个角度来说,hibernate的确不支持多态关联。 """ ROR 中的所谓多态关联的东西完全是应用层的事情,并非 ORM 需要做的。 |
|
返回顶楼 | |
发表时间:2007-05-31
麻烦各位熟悉ROR的简要介绍下究竟“ROR的多态关联”是什么样子的?毕竟多数人没有深入了解ROR。
|
|
返回顶楼 | |
发表时间:2007-06-01
这里我还是以我习惯的python和django为例子吧,看个意思吧。
比如说,你已经有了 Article 和 Movie 两个model,你突然想给他们都加个评论功能,容易想到的做法是加个 ArticleComment 和 Article 关联,MovieComment 和 Movie 关联,比如这样: class ArticleComment article_id = ForeignKey(Article) ...但这样显然不好扩展。 于是你想到写这么一个通用的 Comment model: class Comment content_type = CharField() content_id = IntegerField() content_type 用来标识不同的 model,content_id 用来标识 model 中具体记录的主键id。 这样针对 Article 和 Movie 两个 model 的评论都可以放在这里面。 获取所有针对 Article 的评论: Comment.objects.filter(content_type='article') 获取 Article 评论中的某一个: Comment.objects.filter(content_type='article', content_id=1) 大意就是这样了,当然 rails 的“多态关联”把这个过程自动化了一些。 我最近也碰巧注意到了 rails 的这个东西,这篇文章前面部分简单解释了 rails 这里的 “polymorphic” 与 sqlalchemy 中(也就是 hibernate 中)的 “polymorphic” 的区别。 |
|
返回顶楼 | |
发表时间:2007-06-06
看来我没跑题,和前面说的log例子是同一个问题。
这么说ror里面完美解决了这个? ROR中,当Article或Movie出现子类,比如CartoonMovie后也能自动化地解决么? 似乎hibernate中是没有手段可以搞定,因为commonts属性在父类里面mapping过了,子类mapping里面没法子对其进行覆盖。。。 |
|
返回顶楼 | |
发表时间:2007-06-24
huangyiiiiii 写道 这里我还是以我习惯的python和django为例子吧,看个意思吧。
比如说,你已经有了 Article 和 Movie 两个model,你突然想给他们都加个评论功能,容易想到的做法是加个 ArticleComment 和 Article 关联,MovieComment 和 Movie 关联,比如这样: class ArticleComment article_id = ForeignKey(Article) ...但这样显然不好扩展。 于是你想到写这么一个通用的 Comment model: class Comment content_type = CharField() content_id = IntegerField() content_type 用来标识不同的 model,content_id 用来标识 model 中具体记录的主键id。 这样针对 Article 和 Movie 两个 model 的评论都可以放在这里面。 获取所有针对 Article 的评论: Comment.objects.filter(content_type='article') 获取 Article 评论中的某一个: Comment.objects.filter(content_type='article', content_id=1) 大意就是这样了,当然 rails 的“多态关联”把这个过程自动化了一些。 我最近也碰巧注意到了 rails 的这个东西,这篇文章前面部分简单解释了 rails 这里的 “polymorphic” 与 sqlalchemy 中(也就是 hibernate 中)的 “polymorphic” 的区别。 问个问题 这个例子里的 数据库表中的 content_id字段是否存在外键约束? |
|
返回顶楼 | |
发表时间:2007-06-24
lix23 写道 huangyiiiiii 写道 这里我还是以我习惯的python和django为例子吧,看个意思吧。
比如说,你已经有了 Article 和 Movie 两个model,你突然想给他们都加个评论功能,容易想到的做法是加个 ArticleComment 和 Article 关联,MovieComment 和 Movie 关联,比如这样: class ArticleComment article_id = ForeignKey(Article) ...但这样显然不好扩展。 于是你想到写这么一个通用的 Comment model: class Comment content_type = CharField() content_id = IntegerField() content_type 用来标识不同的 model,content_id 用来标识 model 中具体记录的主键id。 这样针对 Article 和 Movie 两个 model 的评论都可以放在这里面。 获取所有针对 Article 的评论: Comment.objects.filter(content_type='article') 获取 Article 评论中的某一个: Comment.objects.filter(content_type='article', content_id=1) 大意就是这样了,当然 rails 的“多态关联”把这个过程自动化了一些。 我最近也碰巧注意到了 rails 的这个东西,这篇文章前面部分简单解释了 rails 这里的 “polymorphic” 与 sqlalchemy 中(也就是 hibernate 中)的 “polymorphic” 的区别。 问个问题 这个例子里的 数据库表中的 content_id字段是否存在外键约束? 答楼上的,这个方案中,content_id 确实是没有外键约束的,rails使用的应该就是这种方案(这一点还没有仔细考证过)。 不过这篇文章(http://techspot.zzzeek.org/?p=13)中给出了三种实现方案,第二种和第三种都是可以拥有外键约束的。 |
|
返回顶楼 | |
发表时间:2007-08-09
huangyiiiiii 写道 lix23 写道 huangyiiiiii 写道 这里我还是以我习惯的python和django为例子吧,看个意思吧。
比如说,你已经有了 Article 和 Movie 两个model,你突然想给他们都加个评论功能,容易想到的做法是加个 ArticleComment 和 Article 关联,MovieComment 和 Movie 关联,比如这样: class ArticleComment article_id = ForeignKey(Article) ...但这样显然不好扩展。 于是你想到写这么一个通用的 Comment model: class Comment content_type = CharField() content_id = IntegerField() content_type 用来标识不同的 model,content_id 用来标识 model 中具体记录的主键id。 这样针对 Article 和 Movie 两个 model 的评论都可以放在这里面。 获取所有针对 Article 的评论: Comment.objects.filter(content_type='article') 获取 Article 评论中的某一个: Comment.objects.filter(content_type='article', content_id=1) 大意就是这样了,当然 rails 的“多态关联”把这个过程自动化了一些。 我最近也碰巧注意到了 rails 的这个东西,这篇文章前面部分简单解释了 rails 这里的 “polymorphic” 与 sqlalchemy 中(也就是 hibernate 中)的 “polymorphic” 的区别。 问个问题 这个例子里的 数据库表中的 content_id字段是否存在外键约束? 答楼上的,这个方案中,content_id 确实是没有外键约束的,rails使用的应该就是这种方案(这一点还没有仔细考证过)。 不过这篇文章(http://techspot.zzzeek.org/?p=13)中给出了三种实现方案,第二种和第三种都是可以拥有外键约束的。 这个就是前面说的hibernate中的any映射。 看来各种实现都差不多,问题就是出现子类后的双向关联,里面可能会有些问题。 |
|
返回顶楼 | |