2009-08-21 11 views
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とFの両方の直系子孫です。

答えて

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

この1つは少し異なっているが、(E-> IおよびE- > F)。しかし、私はそれがEと私が兄弟であることがひどくはっきりしていないにもかかわらず、あなたが明確にしたようなものだと思う - 私はJからJにリンクすることを確かめなければならなかった。それは少し醜い見えた。

私はこのような種類のグラフを手作業ではなく動的に生成することができる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

+0

偉大な答えをありがとう - 私はこのプロジェクトを探していますが、私は間違いなくそれを使用することができます。私の例では、C、D、EはすべてAとBの両方の子孫です(Fと私は別のものの子孫ですが、必ずしも同じではありません)。明快さの欠如のために申し訳ありません。 –

+0

私は、これが私が探しているものではないかもしれないと言うべきです。 –

+2

あなたの答えの献身のために+1 – Matias

2

私はウィッヒは、ニーズのためにはるかに適しているであろう、独自のPHPクラスを書くことが容易であるべきだと思います。多分このようなもの(擬似コード)

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

難しいのは、完全な構造を管理/構築する方法を書くことです。また、レベルnbrを維持すると、あなたのケースでは多くの助けになるはずです。 階層構造をデータベースに保存することについて既にrelated questions in stackoverflowがあります。