2

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

例子:

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 和 B 的直系后代F等。

4

2 回答 2

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]
}

示例点输出 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

于 2009-08-21T03:01:37.063 回答
2

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

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

挑战在于编写管理/构建完整结构的方法。在你的情况下,坚持水平 nbr 应该会有很大帮助。您已经在 stackoverflow中遇到了有关将层次结构保存到数据库中的相关问题。

于 2009-08-21T03:14:01.847 回答