【问题标题】:hierarchical nested data structure in db4o (or any other oodb)db4o(或任何其他 oodb)中的分层嵌套数据结构
【发布时间】:2011-05-26 09:43:15
【问题描述】:

真的我的问题是,如果我要在 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)中,这会在性能方面出现问题,因为任何对顶级对象(例如主页)的调用也会返回它们下面的所有项目,假设数据库显着增长?

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

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

【问题讨论】:

    标签: java db4o oodb


    【解决方案1】:

    这正是 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

    HTH

    最好的!

    德语

    【讨论】:

    • 感谢德语这么简洁的回答。如果我也能再刺激一点。对于所描述的层次结构,是否有任何范围可以在任何时候以任意级别进入数据库,或者所有操作都必须是作用于树根的方法?我的意思是,应用程序界面是否能够立即获取页面“3”,或者这需要一些迭代,从“Home”到“First Home Child”,最后到“3”以在层次结构中检索这个对象.再次干杯!
    • 请记住,这些系统不仅可以导航,还可以通过不同的查询系统(在 db4o SODA、本机查询等。在其他 ODBQL 等中)访问任意对象。它们还支持索引以快速查询。它们甚至经过优化,因此当您尝试访问集合的一个成员时,您不必遍历所有集合。因此,您不必通过顶级导航来访问持久对象。
    【解决方案2】:

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

    class Page {
      Page parent = null
    }
    

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

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

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

    class Page
    
    class Contains {
       Page container
       Page contained
    }
    

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

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

    【讨论】:

    • 老实说山姆,我对这一切真的很陌生,所以我假设我背后的真实信息很少。你说的是这个……?与其实际存储彼此嵌套的这些 Page 实例(注意那里的 Object 省略),不如将它们放在一个平面结构中,在它们的层次关系之间有一些引用联系?我现在来看看透明激活。这似乎很难开始……干杯!
    • 有多种方法可以做到这一点。我只建议了两个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2020-01-16
    • 2023-01-30
    • 2020-10-03
    相关资源
    最近更新 更多