我正在尝试db4o对象数据库,到目前为止我非常喜欢我所看到的,但我也在stackoverflow上阅读了这篇文章 db4o体验?表明并非所有看起来如此简单的事情都很容易。

目前,我对如何在真实世界的应用程序中使用db4o有一些疑问。因此,如果您有使用db4o工作的经验(特别是在Web应用程序上下文中),我很乐意听到它们。

以下是我的问题:

  1. 在使用db4o存储对象时,如何管理对象标识?**
    来自RDBMS背景,您通常每个表都有一个主键/标识列,我现在无法想象如何在db4o中管理对象标识。

    例如,如果我正在使用NHibernate / mysql并且需要通过id查找User对象,我会执行session.Load(primaryKey)并且它将被PK检索。在表定义中将PK定义为自动增量也是很常见的。

  2. 由于db4o中没有这样的选项,我的想法是使用Guid结构来识别对象数据库中的某些对象。

  3. 在db?

    中查看存储对象的任何工具

    db4o世界中是否存在类似SQL Server Management Studio(可能不太复杂)的内容?我想查看db文件中已存储的数据/对象。

  4. 重命名域对象时是否搞砸了?

    据我所知,当您重命名类时,无法再检索数据库中以前存储的任何实例。有办法解决这个问题吗?如何处理已包含许多对象的实时数据库的更新?

  5. 我可以将属性排除在保存到数据库之外吗?

    例如,如果一个域对象持有对(无状态)服务对象的引用,那么如果域对象被持久化,服务对象也将被持久化,对吧?

  6. 在数据库中保存服务实例似乎有点奇怪,至少对我而言。

    您可以排除服务实例的保存吗?如果再次检索域对象,我如何确保服务也再次注入实例?

有帮助吗?

解决方案

1)在使用db4o存储对象时,如何管理对象标识? 在db4o中,您通常没有ID。 db4o使用 object-identity 区分对象。因此,内存中的同一对象将成为数据库的同一对象。

只要你没有序列化对象,这就可以了。但是,只要对象被序列化/断开连接,这就不再起作用了。例如,在Web场景中:您将数据发送到浏览器。现在,您需要稍后通过某些ID识别对象。

我认为这三种选择是可能的: - 使用 db4o internal id 。然而,这个id不是永远的。对数据库进行碎片整理会更改此ID。 - 使用 db4o的UUID 。但是db4o UUID非常大 - 自己创建ID

2)有一个对象管理器工具来查看数据库。然而,它目前的状态非常有限。在我看来,这是db4o的一个巨大缺点。

3)您可以创建别名,重命名类和字段等。但是,更改继承层次结构不起作用。然后,您需要将旧数据复制到新实例。

4)是的。您可以将字段标记为 transient ,带有.NET-NonSerialized属性或自定义属性。

其他提示

在面向对象的数据库(例如db4o)中,不应该真正使用对象标识。 而是使用了查询和导航。首先执行查询以获取一个/一些对象,然后使用导航来获取其他对象。

'导航'意味着您只需跟踪任何加载对象中的字段/引用。

使用对象标识符可以被认为是错误的样式,大多数应用程序(我知道)根本不使用它们。

在与DB4O合作时,我编写了一个简单的DB4O对象浏览器,它比包含的更好。试一试,它是开源的。

http://sourceforge.net/projects/db4oviewer/develop

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top