我们的数据库包含4,000,000条记录(sql server),它的物理大小为550 MB。 数据库中的实体彼此相关为图形样式。当我从具有5级深度的db加载实体时出现问题(所有记录都被加载)。
与db4O数据库一起使用的最佳类型是什么?
Guid,Generic Collections有什么问题吗?
对于使用db4o的WebApplication,有什么最佳做法吗?会话容器+ EmbeddedDb4ODb或Client / ServerDb4O?
请求帮助..
好的解释。但我想把我的确切问题作为样本: 我有三个实体:( N-N关系.B是交叉点实体。概念:图形)
class A
{
public B[] BList;
public int Number;
public R R;
}
class B
{
public A A;
public C C;
public D D;
public int Number;
}
class C
{
public B[] BList;
public E E;
public F F;
public int Number;
}
我想查询dbContext.A.Include(“BList.C.BList.A”)。包含(“BList.C.E.G”)。Where(....)
I want to get :A.BList.C.BList.A.R But I dont want to get :A.R I want to get :A.BList.C.E.G But I dont want to get :A.BList.C.F I want to get :A.BList.C.E.G But I dont want get :A.BList.D
注意:此要求可以将查询更改为其他查询
额外的问题是有可能加载 A.BList [@ Number< 120] .C.BList.A [@ Number> 100]超级语法:)
答案 0 :(得分:4)
激活:正如你所说,db4o使用它activation-mechanism来控制加载的对象。为了防止加载许多对象,有不同的策略。
configuration.Common.ActivationDepth = 2
然后使用以下策略激活有需要的对象。container.Activate(theObject,5)
然而,所有这些东西在复杂的对象图上都相当痛苦。摆脱痛苦的唯一策略是transparent activation。创建一个像TransparentlyActivated这样的属性。使用此属性标记存储的类。然后使用db4otool来增强您的课程。将db4otool-command添加到Visual Studio中的Post-Build事件:与'PathTo\Db4oTool.exe -ta -debug -by-attribute:YourNamespace.TransparentlyActivated $(TargetPath)
Guid,Generic Collections: 否(在版本7.12或8.0中)。但是,如果存储自己的结构:db4o
处理的结构很差WebApplication:我建议使用嵌入式容器,然后推荐session-container for each request。
扩展问题部分的更新
对你的情况。对于这种复杂的激活模式,我会使用透明激活。 我假设您在实际场景中使用属性而不是公共字段,否则透明持久性不起作用。
透明激活基本上在方法/属性被调用的时刻加载对象。因此,当您访问属性A.R然后A本身它已加载,但不是引用的对象。我只是通过一些访问模式来表明我的意思:
获取'A.BList.C.BList.A.R'
所以当你得到'A.BList.C.BList.A.R'然后'A.R'没有加载
卸载的对象由'empty'-shell对象表示,该对象的所有值都设置为null或默认值。数组总是完全加载,但首先填充未激活的对象。
请注意,没有真正的查询语法可以执行某种精心设计的加载请求。您加载起始对象,然后根据需要提取内容。
我还需要提一下,这种访问在db4o网络上表现糟糕。
还有另一种暗示。如果您想对图形结构进行精心设计的工作,还应该查看图形数据库,例如Neo4J或Sones Graph DB