题
我正在尝试db4o对象数据库,到目前为止我非常喜欢我所看到的,但我也在stackoverflow上阅读了这篇文章 db4o体验?表明并非所有看起来如此简单的事情都很容易。
目前,我对如何在真实世界的应用程序中使用db4o有一些疑问。因此,如果您有使用db4o工作的经验(特别是在Web应用程序上下文中),我很乐意听到它们。
以下是我的问题:
-
在使用db4o存储对象时,如何管理对象标识?**
来自RDBMS背景,您通常每个表都有一个主键/标识列,我现在无法想象如何在db4o中管理对象标识。例如,如果我正在使用NHibernate / mysql并且需要通过id查找User对象,我会执行session.Load(primaryKey)并且它将被PK检索。在表定义中将PK定义为自动增量也是很常见的。
-
由于db4o中没有这样的选项,我的想法是使用Guid结构来识别对象数据库中的某些对象。
-
在db?
中查看存储对象的任何工具db4o世界中是否存在类似SQL Server Management Studio(可能不太复杂)的内容?我想查看db文件中已存储的数据/对象。
-
重命名域对象时是否搞砸了?
据我所知,当您重命名类时,无法再检索数据库中以前存储的任何实例。有办法解决这个问题吗?如何处理已包含许多对象的实时数据库的更新?
-
我可以将属性排除在保存到数据库之外吗?
例如,如果一个域对象持有对(无状态)服务对象的引用,那么如果域对象被持久化,服务对象也将被持久化,对吧?
醇>
在数据库中保存服务实例似乎有点奇怪,至少对我而言。
您可以排除服务实例的保存吗?如果再次检索域对象,我如何确保服务也再次注入实例?
解决方案
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对象浏览器,它比包含的更好。试一试,它是开源的。