我正在尝试db4o对象数据库,到目前为止,我非常喜欢我所看到的,但我也读到了stackoverflow db4o experiences?上的这篇文章,它表明并不是所有看起来那么容易的事情都是容易的。
现在,我有一些关于如何在现实世界的应用中使用db4o的问题。因此,如果你有任何使用db4o的经验(特别是在web应用环境中),我很乐意听听他们的意见。
以下是我的问题:
来自关系型数据库管理系统的背景,通常每个表都有一个主键/标识列,我现在无法想象如何在db4o中管理对象标识。
例如,如果我正在使用NHibernate / mysql,并且需要根据id查找用户对象,我将执行session.Load(primaryKey),它将通过它的PK来检索。在表定义中,主键被定义为自动递增的情况也很常见。
在db4o世界中有没有像SQL Server Management Studio (可能没那么复杂)这样的东西?我想查看db文件中已存储的数据/对象。
据我所知,当您重命名一个类时,数据库中以前存储的任何实例都无法再检索到。有没有办法解决这个问题?如何处理已包含多个对象的实时数据库的更新?
例如,如果一个域对象持有对(无状态)服务对象的引用,那么如果该域对象被持久化,那么该服务对象也将被持久化,对吧?
在数据库中保存一个服务实例似乎有点奇怪,至少对我来说是这样。
是否可以将服务实例排除在保存状态之外?如果再次检索域对象,如何确保服务也再次注入到实例中?
发布于 2009-11-13 07:20:24
1)在使用db4o存储对象时,如何管理对象标识?在db4o中,你通常没有id。db4o使用object-identity来区分对象。因此,内存中的相同对象将成为数据库的相同对象。
只要你不序列化对象,它就能正常工作。然而,一旦对象被序列化/断开,这就不再起作用了。例如,在web场景中:您将数据发送到浏览器。现在,您需要稍后再次通过一些ids来标识对象。
我认为这三个选项是可能的:-使用db4o internal id。然而,这个id不是永远的。对数据库进行碎片整理会更改此id。-使用db4o's UUIDs。但是db4o UUID是相当大的-您自己创建ids
2)有一个对象管理器工具来查看数据库。然而,在目前的状态下,它是极其有限的。在我看来,这是db4o的一个巨大缺陷。
3)您可以创建aliases, rename classes and fields etc。但是,更改继承层次结构并不起作用。然后您需要将旧数据复制到新实例中。
4)是的。您可以使用.NET-非序列化属性或自定义属性将字段标记为transient。
发布于 2012-01-24 01:10:48
在面向对象的数据库(如db4o)中,不应该真正使用对象标识。取而代之的是使用查询和导航。首先执行查询以获取一个/某些对象,然后使用导航获取其他对象。
“导航”意味着你只需跟随任何已加载对象中的字段/引用。
使用对象标识符可以被认为是糟糕的风格,大多数应用程序(据我所知)根本不使用它们。
发布于 2011-11-15 05:47:34
在使用DB4O进行一些工作的同时,我编写了一个简单的DB4O对象浏览器,它的工作性能比附带的浏览器要好得多。试一试,它是开源的。
https://stackoverflow.com/questions/1620355
复制相似问题