Программное обеспечение для хранения иерархических данных - PullRequest
2 голосов
/ 21 августа 2009

Я ищу [бесплатное] серверное программное обеспечение для эффективного хранения иерархических данных. Моя ключевая проблема заключается в том, что у объекта или группы объектов почти всегда есть 2 «родителя», и один или оба родителя могут иметь разные связи с другими родителями, и эти потомки должны отличаться от других потомков общего родителя.

Пример:

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

Полагаю, дело в том, что я бы предпочел использовать это с PHP, но я открыт для изучения нового языка, так как это персональный проект без каких-либо сроков. (Я использую сервер Linux; я не хочу это менять)

Edit: Для пояснения моего примера - C, D и E все прямые потомки A и B, F и I являются потомками чего-то другого, возможно, то же самое, возможно, нет, G и K оба являются прямыми потомками и E и F, и т. д.

Ответы [ 2 ]

5 голосов
/ 21 августа 2009

Я не уверен, что это именно то, что вы ищете, но вы можете использовать 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

2 голосов
/ 21 августа 2009

Я думаю, что должно быть проще написать свои собственные классы php, которые будут гораздо более подходящими для ваших нужд. Может быть, что-то вроде этого (псевдокод)

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

Задача состоит в том, чтобы написать методы для управления / построения полной структуры. Сохранение также уровня nbr должно сильно помочь в вашем случае. У вас уже есть связанных вопросов в stackoverflow о сохранении иерархических структур в базе данных.

...