我正在开始一个项目,我正处于设计阶段:即,我还没有决定我将使用哪个db框架。我将拥有创建“森林”结构的代码。也就是说,许多树,每棵树都是标准的:节点和边。在代码创建这些树之后,我想将它们保存在db中。 (然后最终将它们拉出来)
在db中表示数据的天真方法是具有两个表的关系数据库:节点和边。也就是说,节点表将具有节点id,节点数据等。而边表将是节点id到节点id的映射。
有更好的方法吗?或者给出(有限的)假设,我给出这是最好的方法?如果我们添加树相对较小的假设怎么样 - 将整个树保存为db中的blob会更好吗?在这种情况下我应该使用哪种类型的数据库?请评论速度/可扩展性。
由于
答案 0 :(得分:18)
我展示了一个类似于你的节点和解决方案的解决方案。边缘表,在我对StackOverflow问题的回答中:What is the most efficient/elegant way to parse a flat table into a tree?我将此解决方案称为“闭包表”。
我介绍了在SQL中存储和使用树的不同方法,Models for Hierarchical Data with SQL and PHP。我使用正确的索引(取决于您需要运行的查询)演示了,Closure Table设计可以具有非常好的性能,即使在大型边缘集合中(在我的演示中大约500K边缘)。
我还在书中提到了设计SQL Antipatterns: Avoiding the Pitfalls of Database Programming。
答案 1 :(得分:1)
请务必对正在使用的实体使用某种低级编码以防止循环。实体可能是部分,主题,文件夹等。
使用Entity文件和Entity-Xref文件,您可以遍历两个文件(父文件和子关系)之间的两个关系之一。
级别是实体在树中找到的级别。实体的低级代码是在任何树中的任何树中找到实体的最低级别。检查以确保要生成子项的实体的低级代码小于或等于阻止循环。将实体添加为子项后,它将至少降低一级。