db4o(或任何其他oodb)中的分层嵌套数据结构

时间:2011-05-26 09:43:15

标签: java db4o oodb

真的我的问题是,如果我在oodb中使用嵌套数据结构,我会在db中的其他实例中放置类的实例,或者是否需要某种关系映射

我对OODB(面向对象数据库)感兴趣已有一年左右了。我本质上是一个网络/应用程序开发人员,有一段时间以来,他们已经注意到代表复杂层次结构的复杂性和性能方面的严重限制,例如MS T-SQL和MySQL等关系模型中的网站层次结构。

提供一个快速java(伪代码)示例: -

CLASS / DB TYPE:

public class PageObject{

    public String title = "";
    public String shortname = "";
    public boolean published = false;
    public PageObject[] pages = null;

    public PageObject() {}

}

因此,如果我们从这个类开始,它能够在pages数组(或vector,或者集合或其他)中保存同一个类的其他实例,那么我们最终可能会得到一个站点布局的可能性。例如: -

  • 主页
    • 第一个家庭儿童
      • 1
      • 2
      • 3
    • 第二个家庭孩子
    • 第三个家庭孩子

看一下,我们可以看到 Home 项目中有3个项目存储在 pages 集合中, <此集合中的em> First Home Child 项目,在其页面集合中还有3个项目。

如果我们要将此结构存储在DB4O(或任何其他OODB)中,这会在性能方面存在问题,因为任何对顶级对象(如主页)的调用也会返回其下面的所有项目,假设数据库显着增长?

这个问题可能看起来很主观,为此我提前道歉,但我似乎无法摆脱关系模型,因此在尝试计划任何类型的数据模型时遇到实际问题,我在代码中进一步开展工作。

任何人都可以清楚地了解这一点在这个阶段绝对值得赞赏!任何想法提前干杯!

2 个答案:

答案 0 :(得分:4)

当你处理复杂的对象层次结构时,这就是OODB恰好适合的地方,其中表和连接感觉有点过分。 db4o(以及Versan't VOD等其他oodbs)不需要使用连接(如在rdbms中)并透明地处理对象之间的关系(如对象模型中所定义)。实质上,您的对象模型最终成为您的数据模型或模式。在处理嵌套结构时,这些oodbms系统通常比rdbms表现更好,甚至可以处理循环引用。

为了避免加载/存储比预期更多的对象,oodbms可以使用任意级别的对象激活(或更新)深度(例如,在您的示例中,您可以告诉数据库仅检索/更新第一级别的子级)。或者,您可以将它们配置为透明持久性模式(如Sam建议的那样),其中db仅检索或更新您按需访问的内容(即,在导航对象树时)。

更多信息(db4o): http://developer.db4o.com/Documentation/Reference/db4o-8.0/java/reference/Content/basics/activation.htm

HTH

最佳!

德国

答案 1 :(得分:0)

如果您的层次结构确实是一棵树,那么使用父关系对此进行建模会不会更好(抱歉,我不能让自己使用名为PageObject的类):

class Page {
  Page parent = null
}

?然后,您可以通过搜索具有空Parent的所有Page来查找根。

一般来说,您还应该了解透明激活。

另一种“半关系”方式是定义没有包含信息和包含关系对象的Page对象:

class Page

class Contains {
   Page container
   Page contained
}

在这里,将Contains对象从数据库中拉出最坏的情况会拉出两个页面。您需要仔细管理页面删除。

PS:请原谅我的缩写Java,我已经习惯了Scala。