把关系表取个新名字,变成实体 N:N的实体关系 变成两个1:N 关系

来源:互联网 发布:网络出版编辑岗位培训 编辑:程序博客网 时间:2024/05/17 01:37

N:N的实体关系,可以把关系变成 转化为 一个实体, 这样N:N的关系就弱化成了 老实体 N:1  关系实体 1:N 老实体


第三个类

在数据库中,用三个表表示 m:m 关系:前两个表您已经知道了(Book 和 Author),第三个是一个连接表(BookAuthor)。GORM 向 BookAuthor 连接表添加 book_id 和 author_id,而不是向 Book 或 Author 表添加一个外键。连接表允许将具有一个作者的图书和具有多个作者的图书持久化。它还能够表示编写多部图书的作者。Author 和 Book 外键的每种惟一组合都会在连接表中有惟一的记录。这种方法具有极大的灵活性:一本书可以有任意数量的作者,而一个作者可以编写任意数目的图书。

Dierk Koenig 曾经告诉我,“如果您认为只有两个对象共享一个简单的多对多关系,那么您对多对多关系的了解还不够透彻。还存在第三个对象,这个对象有其自己的属性和生命周期”。确实如此,Book 和 Author 之间的关系已经超出了简单连接表的范围。例如,Dierk 是 Groovy in Action(Manning Publications,2007 年 1 月)的第一作者。第一作者的身份应该表示为 Author 与 Book 之间的关系中的一个字段。其他各种因素也应如此:作者会按特定顺序在封面上列出;每个作者编写图书的特定章节;而且每个作者的报酬也因贡献不同而异。您可以看到,Author 与 Book 之间的关系比最初计划的更加微妙。在真实世界中,每个作者都会签订一份合同,使用明确的条款详细描述他与这部图书之间的关系。或许应该创建一个一级类 Contract 来更好地表示 Book 与 Author 之间的关系。 

取名字永远是头痛的东西, 锦囊中就遇到了如下问题, ad和position 形成的关系表 , 有了很多自己的属性(hibernate embedded ) , hibernate对关系查询并不是很好;;

这个时候就需要有一个专门的实体来替代这个关系 embedded 类; 已有的<Position, PositionInfo> getPositionInfoMap 

简单来讲,这意味着一个 m:m 关系实际上就是两个 1:m 关系。如果两个类有可能共享一个 m:m 关系,那么您应该更深入地研究一下,确定出具有两个 1:m 关系的第三个类并显式地定义它。

http://www.ibm.com/developerworks/cn/java/j-grails04158/