我正在寻找[免费]服务器软件来有效存储分层数据。我的主要挑战是一个物体或一组物体几乎总是有两个“父母”,一个或两个父母可以与其他父母有不同的联系,这些后代必须与普通父母的其他后代不同。
示例:
A and B
C
D
E and F
G
H
E and I
J
K
L and M
...
我想问题可能是因为我非常喜欢在PHP中使用它,但我愿意学习一门新语言,因为这是一个没有任何截止日期的个人项目。 (我正在使用Linux服务器;我不愿意改变它)
编辑: 为了澄清我的例子 - C,D和E都是A和B的直接后代,F和I是其他东西的后代,可能是相同的东西,可能不是,G和K都是直接的E和F的后代等等。
答案 0 :(得分:5)
我不确定这是否正是您正在寻找的,但您可以使用Graphviz dot来建模/绘制关系。这是.dot文件的更新内容,更像是您的澄清:
digraph G {
compound = true // allow edges between clusters
subgraph cluster_ab {
rank = same;
A -> B -> A
}
A -> C [ltail=cluster_ab]
A -> D [ltail=cluster_ab]
A -> E [ltail=cluster_ab]
subgraph cluster_ef {
rank = same;
E -> F -> E
}
E -> G [ltail=cluster_ef]
E -> H [ltail=cluster_ef]
subgraph cluster_ei {
E -> I -> E
}
I -> J [ltail=cluster_ei]
I -> K [ltail=cluster_ei]
}
sample dot output http://img21.imageshack.us/img21/6177/64094067.png
这个有点不同,因为你不能创建重叠的簇(E-> I和E-> F)。但我认为这更像是你澄清的方式,即使E和我是兄弟姐妹并不是非常明显 - 我也必须确保从我到J,K之间的链接,否则会有警告和它看起来有点丑陋。
有plenty of libraries that interface with Graphviz/dot可以让你动态生成这些类型的图形,而不是像我一样手工生成。然后,如果您已经有一个库来存储/检索有向图,那么您就可以存储分层数据了。至于它是否效率,正如你在问题中提到的那样......当然取决于你存储的数据量。
<小时/> 正如@Kim在评论中指出的那样,你可以通过将兄弟姐妹视为成对而不是单个节点来获得一个非常简化的图:
digraph G {
"A,B" -> C
"A,B" -> D
"A,B" -> E
"E,F" -> G
"E,F" -> H
"E,I" -> J
"E,I" -> K
}
这是一个明显而优雅的解决方案,我完全忽略了,尽管在发生重叠时(E再次),兄弟关系仍然有点含糊不清。
simpler graph http://img35.imageshack.us/img35/8969/so2b.png
答案 1 :(得分:2)
我认为应该更容易编写自己的php类,这将更适合您的需求。也许是这样的(伪代码)
Class Item
[List of Item] Parents
[List of Item] Children
挑战在于编写管理/构建完整结构的方法。坚持水平nbr应该对你的情况有很大的帮助。 您已经有related questions in stackoverflow关于将层次结构保存到数据库中。