真的我的问题是,如果我在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,或者集合或其他)中保存同一个类的其他实例,那么我们最终可能会得到一个站点布局的可能性。例如: -
看一下,我们可以看到 Home 项目中有3个项目存储在 pages 集合中, <此集合中的em> First Home Child 项目,在其页面集合中还有3个项目。
如果我们要将此结构存储在DB4O(或任何其他OODB)中,这会在性能方面存在问题,因为任何对顶级对象(如主页)的调用也会返回其下面的所有项目,假设数据库显着增长?
这个问题可能看起来很主观,为此我提前道歉,但我似乎无法摆脱关系模型,因此在尝试计划任何类型的数据模型时遇到实际问题,我在代码中进一步开展工作。
任何人都可以清楚地了解这一点在这个阶段绝对值得赞赏!任何想法提前干杯!
答案 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。