软件来存储分层数据

我正在寻找[免费]服务器软件来有效地存储分层数据。 我的关键挑战是一个对象或一组对象几乎总是有2个“父母”,父母一方或双方可以与其他父母有不同的联系,而这些后代必须与共同父母的其他后代不同。

例:

A and B C D E and F G H E and I J K L and M ... 

我想这个问题可能是因为我非常喜欢用这个PHP,但是我愿意学习一门新的语言,因为这是一个没有截止date的个人项目。 (我正在使用Linux服务器;我不想改变这一点)

编辑:澄清我的例子 – C,D和E都是A和B的直系后代,F和I是其他事物的后代,可能是同一事物,可能不是,G和K都是E和E的直系后代F等

    我不确定这是否正是您正在寻找的内容,但您可以使用Graphviz点来模型/图表关系。 以下是.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] } 

    样点输出http://img21.imageshack.us/img21/6177/64094067.png

    这个有点不同,因为你不能创建重叠的集群(E-> I和E-> F)。 但我认为这更像你已经澄清的方式,尽管E和我是兄弟姐妹不是很明显 – 我也必须确保从I到J,K的联系,否则有一个警告和它看起来有点丑陋。

    有很多库与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再次)。

    更简单的图表http://img35.imageshack.us/img35/8969/so2b.png

    我认为应该更容易编写自己的PHP类,这将更适合您的需求。 也许这样(伪代码)

     Class Item [List of Item] Parents [List of Item] Children 

    面临的挑战是编写管理/构建完整结构的方法。 坚持的水平NB应该帮助你的情况很多。 您已经有关于将分层结构保存到数据库中的相关问题 。