和db4o一起工作的几个问题

18

我正在尝试使用db4o对象数据库,到目前为止,我很喜欢它所展现的功能,但是我也读到了stackoverflow上的这篇帖子db4o experiences? ,这表明并不是所有看起来简单的事情都是容易的。

现在,我有一些关于如何在真实世界应用程序中使用db4o的问题。因此,如果您有任何使用db4o(特别是在Web应用程序上下文中)的经验,我很想听听您的意见。

以下是我的问题:

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

    例如,如果我正在使用NHibernate / mysql开发,并需要按ID查找用户对象,则会执行session.Load(primaryKey),然后将其检索出来。在表定义中,将PK定义为自动递增非常常见。

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

  3. 有哪些工具可以查看db中存储的对象?

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

  4. 当重命名域对象时, 你会遇到什么问题吗?

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

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

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

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

你能够排除服务实例被保存吗?如果领域对象再次被检索,如何确保服务也被再次注入实例中?


+1 这是一个好问题 - 我希望我能帮助你。 - David Robbins
3个回答

13

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

只要不序列化对象,这种方法就能很好地运行。但是,一旦对象被序列化/断开连接,它就不再起作用了。例如,在Web场景中:您将数据发送到浏览器。现在,您需要稍后通过一些ID再次识别这些对象。

我认为有三个选择: - 使用db4o内部id。但是,这个id不是永久性的。重组数据库会更改此id。 - 使用db4o的UUIDs。但是db4o的UUID相当大。 - 自己创建ID。

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

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

4) 可以使用 .NET-NonSerialized 属性或自定义属性将字段标记为 短暂的


db4o已经重构了其网站,这破坏了上面发布的所有链接。 - Tom

2
在面向对象的数据库中(如db4o),不应该真正使用对象标识。相反,应该使用查询和导航。首先执行一个查询以获取一个/一些对象,然后使用导航来到达其他对象。
“导航”意味着只需跟随任何已加载对象中的字段/引用即可。
使用对象标识符可能被认为是不好的风格,大多数应用程序(我所知道的)根本不使用它们。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接