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 など

4

2 に答える 2

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

サンプルドット出力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 に答える