18

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

现在,我有一些关于如何在现实世界的应用程序中使用 db4o 的问题。因此,如果您有任何使用 db4o 工作的经验(尤其是在 Web 应用程序环境中),我很想听听他们的意见。

以下是我的问题:

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

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

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

  3. 有什么工具可以查看数据库中存储的对象吗?

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

  4. 重命名域对象时你搞砸了吗?

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

  5. 我可以排除保存到数据库的属性吗?

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

至少对我来说,将服务实例保存在数据库中似乎有点奇怪。

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

4

3 回答 3

13

1) 在使用 db4o 存储对象时如何管理对象身份?在 db4o 中,您通常没有 id。db4o 使用对象标识来区分对象。所以内存中的同一个对象将是数据库的同一个对象。

只要您不序列化对象,它就可以正常工作。但是,一旦对象被序列化/断开连接,这将不再起作用。例如在网络场景中:您将数据发送到浏览器。现在您需要稍后通过一些 id 再次识别对象。

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

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

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

4) 是的。您可以使用 .NET-NonSerialized 属性或自定义属性将字段标记为瞬态。

于 2009-11-12T23:20:24.180 回答
2

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

“导航”意味着您只需遵循任何加载对象中的字段/引用。

使用对象标识符可能被认为是不好的风格,大多数应用程序(我知道)根本不使用它们。

于 2012-01-23T17:10:48.203 回答
1

在使用 DB4O 进行一些工作时,我编写了一个简单的 DB4O 对象浏览器,它比包含的浏览器好得多。试试看,它是开源的。

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

于 2011-11-14T21:47:34.203 回答