有这样的数据库吗?

时间:2009-06-26 06:14:42

标签: database graph-databases object-oriented-database

背景:好的,所以我正在寻找我猜的对象数据库。但是,我所看到的(通常很少)对象数据库是简单的持久层,而不是完整的DBMS。我不知道我正在寻找的东西是否被认为是一个对象数据库,所以非常感谢任何指导我正确方向的帮助。


我不想给你两页描述我正在寻找的东西,所以我将用一个例子来说明我的观点。假设我有一个“BlogPost”对象需要存储。像这样的东西,伪代码:

class BlogPost
    title:String
    body:String
    author:User
    tags:List<String>
    comments:List<Comment>

(假设Comment是它自己的类。)

现在,在关系数据库中,author将存储为指向User.id的外键,而tagscomments将存储为一个 - 使用单独的表来存储关系的to-many或many-to-many关系。我想要的是一个执行以下操作的数据库引擎:

  • 使用直接引用存储相关对象(authortags等),而不是使用需要额外查找的外键;换句话说,数据库本身支持彼此对立的对象
  • 允许我在博客文章中添加评论或标签,而无需检索整个对象,更新它,然后将其放回数据库(如面向文档的数据库 - CouchDB就是一个例子)

我想我正在寻找的是一个导航数据库,但我不知道。有什么东西甚至与我的想法相似吗?如果是这样,它叫什么? (或者更好的是,给我一个实际的工作数据库。)或者我是否过于挑剔?


编辑:

只是为了澄清,我不是在寻找ORM 或抽象层或类似的东西。我正在寻找一个内部执行此操作的实际数据库。对不起,如果我很难,但我已经搜索过,我找不到任何东西。


编辑:

此外,JVM的功能非常出色,但此时我真的不关心它运行的平台。

11 个答案:

答案 0 :(得分:7)

我认为您所描述的内容可以轻松地在 graph database 中建模。然后,您将获得导航到要进行更改的节点/边缘的好处,而无需检索任何其他内容。对于JVM,有Neo4j开源图数据库(我是团队的一部分)。您可以在High Scalability处阅读相关信息,作为thinkvitaminthis stackoverflow thread概述的一部分。至于标签,我认为如果你想找到相关的标签和类似的东西,将它们存储在图形数据库中会给你一些额外的好处。只需在mailing list上放一行,我相信社区会帮助您。

答案 1 :(得分:5)

您可以尝试使用C#和Java中提供的db4o

答案 2 :(得分:2)

我认为我们正在寻找:http://www.odbms.org/。这个站点有一些关于对象数据库的好信息,包括Objectivity,它是一个非常好的对象数据库。

答案 3 :(得分:1)

你所描述的完全可以通过在普通RDBMS上运行的(N)Hibernate来完成。

将这种持久层与普通数据库一起使用的优点是,您可以将标准数据库系统与方便的编程相结合。你以一种非常自然的方式声明你的类,并且(N)Hibernate提供了一种在引用/列表和外键关系之间进行转换的方法。

Java教程:http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial-firstapp.html

.NET教程:https://web.archive.org/web/20081212181310/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/01/your-first-nhibernate-based-application.aspx

如果您坚持不想使用支持良好的标准RDBMS,并且宁愿将您的数据信任于更具异国情调且经过较少测试的内容,那么您正在寻找Object Relational Database

但是,这样的产品可能最好通过使其成为标准RDBMS上的一层来实现。这可能就是为什么像(N)Hibernate这样的ORM是最流行的解决方案 - 它们允许应用标准的RDBMS软件(以及广泛可用的管理/用户技能),但编程经验是99%基于对象的。

答案 4 :(得分:1)

答案 5 :(得分:0)

这正是LINQ的设计目标。

  

Microsoft LINQ定义了一组专有查询运算符,可用于查询,投影和过滤数组,可枚举类,XML(XLINQ),关系数据库和第三方数据源中的数据。虽然它允许查询任何数据源,但它要求将数据封装为对象。因此,如果数据源本身不将数据存储为对象,则必须将数据映射到对象域。使用查询运算符编写的查询由LINQ查询处理引擎执行,或者通过扩展机制执行,移交给LINQ提供程序,LINQ提供程序实现单独的查询处理引擎或转换为不同的格式以在单独的数据存储上执行(例如在数据库服务器上作为SQL查询(DLINQ))。查询结果作为内存中对象的集合返回,可以使用标准迭代器函数(如C#的foreach)枚举。

答案 6 :(得分:0)

有各种各样的术语,都与Object-Relational Mapping相关联,也就是ORM,这可能是你查找最有用的术语。 ORM库存在许多编程语言。

答案 7 :(得分:0)

Oracle的nested tables提供了该功能的一部分,但在更新中,您不能只在嵌套表中添加一行 - 您必须替换整个嵌套表。

答案 8 :(得分:0)

我猜您正在寻找带有“ EntityFirst ”方法的ORM。

在EntityFirst方法中,开发人员最不[关注]数据库。您只需构建实体或对象即可。然后,ORM负责将实体存储在数据库中并随意检索它们。

唯一的EntityFirst ORM我知道“Signum”。这是一个建立在.net之上的精彩框架。我建议你在 SignumFramework 网站上查看一些videos,我相信你会发现它很有用。

链接文字:http://www.signumframework.com

感谢。

答案 9 :(得分:0)

也许是ZODB? 好介绍在这里找到: http://www.ibm.com/developerworks/aix/library/au-zodb/

答案 10 :(得分:0)

你可以试用STSdb,DB4O,Perst ......这在C#和Java中可用。