关于使用db4o的几个问题?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

现在,我对如何在实际应用中使用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. 重命名域对象时,你是否搞砸了? 据我所知,当你重命名一个类时,以前存储在db中的任何实例都不能被检索到。有没有办法解决这个问题?你如何处理已经包含许多对象的实时数据库的更新?
  5. 我可以排除将属性保存到数据库吗? 例如,如果一个域对象持有对一个(无状态)服务对象的引用,那么如果域对象被持久化,服务对象也将被持久化,对吧?

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

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

提问于
用户回答回答于

1)在使用db4o存储对象时如何管理对象标识?在db4o中,你通常没有ID。db4o使用对象标识区分对象。所以内存中的同一个对象将成为数据库的同一个对象。

只要你不序列化对象,这工作得很好。但是一旦对象被序列化/断开连接,这就不再起作用了。例如,在Web方案中:您将数据发送到浏览器。现在,您需要再次通过某些ID识别对象。

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

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

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

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

用户回答回答于

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

'导航'意味着你只需按照任何加载对象中的字段/引用。

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

扫码关注云+社区