1

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

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

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

类/数据库类型:

public class PageObject{

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

    public PageObject() {}

}

因此,如果我们从此类开始,它将能够在 pages 数组(或向量,或集合或其他任何东西)中保存同一类的其他实例,我们最终可能会拥有这样的站点布局:-

    • 第一个家庭孩子
      • 1
      • 2
      • 3
    • 第二个家的孩子
    • 第三个家的孩子

看看这个,我们可以看到Home项目将有 3 个项目存储在它的pages集合中,而这个集合中的第一个 Home Child项目在它自己的pages集合中还有另外 3 个项目。

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

这个问题可能看起来很主观,为此我提前道歉,但我似乎无法摆脱关系模型,所以在我进入之前甚至试图规划任何类型的数据模型时都遇到了真正的问题进一步的代码工作。

在这个阶段,任何人都可以阐明这一点,我们将不胜感激!提前为任何想法干杯!

4

2 回答 2

4

这正是 OODB 适合的地方,当您处理复杂的对象层次结构时,表和连接感觉过大了。db4o(以及其他 oodb,例如 Versan't VOD)不需要使用连接(如在 rdbms 中)并透明地处理对象之间的关系(如在您的对象模型中定义的那样)。本质上,您的对象模型最终成为您的数据模型或模式。这些 oodbms 系统在处理嵌套结构时通常比 rdbms 执行得更好,甚至可以处理循环引用。

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

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

高温高压

最好的!

德语

于 2011-05-27T14:02:30.380 回答
0

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

class Page {
  Page parent = null
}

? 然后,您可以通过搜索所有父级为空的页面来找到根。

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

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

class Page

class Contains {
   Page container
   Page contained
}

在这里,从数据库中拉出一个包含对象最坏的情况是拉出两个页面。不过,您需要仔细管理页面删除。

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

于 2011-05-26T10:56:35.423 回答