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

pau*_*aul 15 oop db4o object-oriented-database

我认为现在是时候看看OO数据库,并决定将db4o用于我的下一个小项目 - 一个小型库.

请考虑以下对象:Book,Category.

一本书可以是0-n类别,一个类别可以应用于0-m书籍.

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

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

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

RMo*_*sey 9

我真的只有两种方法可以解决这个问题,你提到过这两种方法.就个人而言,我会采用第一种方法(创建一个映射对象作为OO实体).这可以防止您保持冗余信息并且必须同步; 它还意味着如果协会最终拥有自己的字段(该书被分配到该类别的日期,比方说),它们可以很容易地合并.我们将这种方法用于我们系统中的各种关联.

OO实体看起来像:

BookCategory {
 Book book
 Category category
}
Book {
 Collection <BookCategory> categories
}
Category {
 Collection <BookCategory> categories
}
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是设置如下设置:

Book {
 Collection<Category> categories
}

Category {
 Collection<Books> books
}
Run Code Online (Sandbox Code Playgroud)

如果你的ORM/DB工具自动维护关联,这很好; 否则,您将无法更新两个集合.(在Hibernate中,一方将具有属性:inverse = true在映射上;这一方面没有更新,所以严格来说它不需要维护.但在我看来这似乎是不好的做法.)

如果您通常只以一种方式访问​​关系(例如,获取某个类别中的所有书籍),则可以在另一方面删除该集合; 那么我认为你必须解决ORM工具并使用本机查询才能从另一个方向访问关系.

我们在项目中使用Hibernate(基于java的对象关系映射工具); Hibernate文档是OO /关系设计问题的一个很好的参考,尽管你可能需要花一点时间学习Hibernate来使它们变得有用:http: //docs.jboss.org/hibernate/stable/core/reference/en/ html_single /#集合,ofvalues

HTH!


Bog*_*_Ch 4

如果使用对象数据库,则无需关心如何在数据库中存储关系.您可以定义它们之间的类和关系.请阅读引导到您的数据库的参考.关系的例子:

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
}
Run Code Online (Sandbox Code Playgroud)