用于存储分层数据的软件

Ale*_*x S 2 php linux hierarchy

我正在寻找[免费]服务器软件来有效地存储分层数据.我的主要挑战是一个物体或一组物体几乎总是有2个"父母",而父母中的一个或两个可以与其他父母有不同的联系,这些后代必须与普通父母的其他后代保持不同.

例:

A and B
    C
    D
    E and F
        G
        H
    E and I
        J
        K
L and M
    ...
Run Code Online (Sandbox Code Playgroud)

我想这可能是因为我非常喜欢在PHP中使用它,但我愿意学习一门新语言,因为这是一个没有任何截止日期的个人项目.(我正在使用Linux服务器;我不愿意改变它)

编辑:为了澄清我的例子 - C,D和E都是A和B的直接后代,F和I是其他东西的后代,可能是相同的东西,可能不是,G和K都是E和E的直接后代F等

Mar*_*off 5

我不确定这是否正是您正在寻找的,但您可以使用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]
}
Run Code Online (Sandbox Code Playgroud)

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

这个有点不同,因为你不能创建重叠的簇(E-> I和E-> F).但我认为这更像是你澄清的方式,即使E和我是兄弟姐妹并不是非常明显 - 我也必须确保从我到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
}
Run Code Online (Sandbox Code Playgroud)

这是一个明显而优雅的解决方案,我完全忽略了,尽管在重叠发生时,兄弟关系仍然有点含糊不清(E再次).

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