首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在对象数据库中设计多对多关系?

如何在对象数据库中设计多对多关系?
EN

Stack Overflow用户
提问于 2009-07-01 13:36:03
回答 6查看 8.2K关注 0票数 15

我想是时候看看面向对象的数据库了,并决定在我的下一个小项目中使用db4o -一个小型库。

考虑以下对象: Book、Category。

一本书可以属于0-n个类别,一个类别可以应用于0-m本书。

我的第一个想法是有一个连接对象,比如BookCatecory,但经过谷歌搜索,我发现这并不适合‘真正的OO’。

因此,另一种方法(被许多人推荐)是在两个对象中都有一个列表: Book.categories和Category.books。一方处理关系: Book.addCategory将类别添加到Book.categories,将图书添加到Category.books。当两个对象在一个方法调用中被更改时,如何处理提交和回滚?

你的想法是什么?第二种方法有明显的优势,但至少对我来说,第一种“感觉”是正确的(更好的规范化)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-01 13:52:25

如果你使用对象数据库,你不需要关心关系是如何存储在数据库中的。您可以定义类和它们之间的关系。请阅读您的数据库的参考指南。关系示例:

代码语言:javascript
复制
n:n attribute, referencing from the parent
------------------------------------------------------------------
class Person {
    List addresses;
}

class Address {
}


n:n attribute, referencing from the child
------------------------------------------------------------------
class Person {
}

class Address {
    List persons
}

n:n attribute, bidirectional references
------------------------------------------------------------------
class Person {
    List addresses;
}

class Address {
    List persons
}
票数 4
EN

Stack Overflow用户

发布于 2009-09-02 19:40:18

我真的只有两种方法可以解决这个问题,这两种方法你都提到过。就我个人而言,我倾向于第一种方法(将映射对象创建为OO实体)。这可以防止您保留冗余信息并进行同步;这还意味着,如果关联最终拥有自己的字段(假设图书被分配到该类别的日期),则可以很容易地合并这些字段。我们将这种方法用于我们系统中的各种关联。

OO实体将如下所示:

代码语言:javascript
复制
BookCategory {
 Book book
 Category category
}
Book {
 Collection <BookCategory> categories
}
Category {
 Collection <BookCategory> categories
}

在这里,您必须使关系对象和两个集合保持同步;但是,在这种情况下,集合是可选的。通常,您可以使用ORM查询获得相同的信息,例如: select b.book from BookCategory b where b.category = MyCategory

另一种方法是设置如下:

代码语言:javascript
复制
Book {
 Collection<Category> categories
}

Category {
 Collection<Books> books
}

如果您的ORM/DB工具自动维护这些关联,这很好;否则,您将无法同时更新这两个集合。(在Hibernate中,映射的一端将具有属性: inverse=true;这一端不会更新,因此严格地说它不需要维护。不过,在我看来,这似乎是一种糟糕的做法。)

如果您通常只以一种方式访问关系(例如,获取某个类别中的所有图书),则可以消除另一端的集合;然后,我认为您必须绕过ORM工具并使用原生查询,以便从另一方向访问关系。

我们在项目中使用Hibernate (一个基于java的对象关系映射工具);Hibernate文档是解决面向对象/关系设计问题的很好的参考资料,尽管您可能需要花一点时间学习Hibernate才能使它们有用:http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#collections-ofvalues

哈!

票数 9
EN

Stack Overflow用户

发布于 2009-07-01 13:50:01

我想你只是有点沉迷于关系型数据库的思维方式。在每个对象中列出列表是正确的面向对象方法。提交和回滚是没有问题的,它们发生在提交所有内容或回滚所有内容的事务中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1069187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档