在RavenDb中,我必须存储分层数据,我需要递归地查询它。性能是这里最关注的问题。
我所拥有的与以下内容类似:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public Category Parent { get; set; }
}
在这种情况下,如果我将父类别存储在文档本身中,我将很难管理数据,因为我将在整个地方复制类别。
所以,为了方便起见,我可以将其存储如下:
public class Category
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Name { get; set; }
}
但在这种情况下,我不确定性能将如何,因为我将拥有数百万条记录,我需要从此参考创建类别树。
在性能是最关注的问题时,RavenDb中是否有关于如何建模此类数据的决定?
答案 0 :(得分:4)
层次结构通常最好在一个定义层次结构的文档中建模。在您的情况下,将定义类别树,其中类别本身可以由独立文档表示(因此保持名称,描述等,并允许其他集合引用它们),或不。“
从代码建模,类别文档看起来像这样:
public class Category
{
public string Id { get; set; }
public string Name { get; set; }
// other meta-data that you want to store per category, like image etc
}
层次结构树文档可以从类如下的类中序列化,其中该类可以使用方法使其中的节点易于访问:
public class CategoriesHierarchyTree
{
public class Node
{
public string CategoryId { get; set; }
public List<Node> Children { get; set; }
}
public List<Node> RootCategories { get; private set; }
// various methods for looking up and updating tree structure
}
这种层次结构树的方法有几个重要的优点:
我强烈建议采用这种方法。这有点偏离关系心态,但即使树长大,它也是如此值得。