我想是时候看看面向对象的数据库了,并决定在我的下一个小项目中使用db4o -一个小型库。
考虑以下对象: Book、Category。
一本书可以属于0-n个类别,一个类别可以应用于0-m本书。
我的第一个想法是有一个连接对象,比如BookCatecory,但经过谷歌搜索,我发现这并不适合‘真正的OO’。
因此,另一种方法(被许多人推荐)是在两个对象中都有一个列表: Book.categories和Category.books。一方处理关系: Book.addCategory将类别添加到Book.categories,将图书添加到Category.books。当两个对象在一个方法调用中被更改时,如何处理提交和回滚?
你的想法是什么?第二种方法有明显的优势,但至少对我来说,第一种“感觉”是正确的(更好的规范化)。
发布于 2009-07-01 13:52:25
如果你使用对象数据库,你不需要关心关系是如何存储在数据库中的。您可以定义类和它们之间的关系。请阅读您的数据库的参考指南。关系示例:
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
}发布于 2009-09-02 19:40:18
我真的只有两种方法可以解决这个问题,这两种方法你都提到过。就我个人而言,我倾向于第一种方法(将映射对象创建为OO实体)。这可以防止您保留冗余信息并进行同步;这还意味着,如果关联最终拥有自己的字段(假设图书被分配到该类别的日期),则可以很容易地合并这些字段。我们将这种方法用于我们系统中的各种关联。
OO实体将如下所示:
BookCategory {
Book book
Category category
}
Book {
Collection <BookCategory> categories
}
Category {
Collection <BookCategory> categories
}在这里,您必须使关系对象和两个集合保持同步;但是,在这种情况下,集合是可选的。通常,您可以使用ORM查询获得相同的信息,例如: select b.book from BookCategory b where b.category = MyCategory
另一种方法是设置如下:
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
哈!
发布于 2009-07-01 13:50:01
我想你只是有点沉迷于关系型数据库的思维方式。在每个对象中列出列表是正确的面向对象方法。提交和回滚是没有问题的,它们发生在提交所有内容或回滚所有内容的事务中。
https://stackoverflow.com/questions/1069187
复制相似问题