2009-08-21 8 views
2

Je suis à la recherche d'un logiciel serveur [gratuit] pour stocker efficacement les données hiérarchiques. Mon principal défi est qu'un objet ou un groupe d'objets a presque toujours deux «parents» et qu'un ou les deux parents peuvent avoir des liens différents avec d'autres parents, et ces descendants doivent rester distincts des autres descendants du parent commun.Logiciel pour stocker des données hiérarchiques

Exemple:

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

Je suppose que le Gotcha sera probablement que je préfère fortement de l'utiliser avec PHP, mais je suis ouvert à l'apprentissage d'une nouvelle langue, car cela est un projet personnel sans toute date limite. (J'utilise un serveur Linux, je ne suis pas prêt à changer cela)

Edit: Pour clarifier mon exemple - C, D et E sont tous descendants directs de A et B, F et I sont des descendants de quelque chose d'autre, peut-être la même chose, peut-être pas, G et K sont tous deux des descendants directs de E et F, etc.

Répondre

5

Je ne sais pas si c'est exactement ce que vous cherchez, mais vous pouvez utiliser Graphviz dot pour modéliser/graver des relations. Voici le contenu mis à jour du fichier .dot, plus comme votre précision:

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

Celui-ci est un peu différent, parce que vous ne pouvez pas créer des groupes qui se chevauchent (E> I et E > F). Mais je pense que c'est plus comme la façon dont vous avez clarifié, même si ce n'est pas très apparent que E et moi sommes frères et soeurs - je devais aussi m'assurer de lier de I à J, K, sinon il y avait un avertissement et ça avait l'air un peu plus laid.

Il ya plenty of libraries that interface with Graphviz/dot qui vous permettrait de générer ces types de graphiques dynamiquement, plutôt que manuellement comme je l'ai fait. Ensuite, si vous avez déjà une bibliothèque pour stocker/récupérer des graphes orientés, vous y trouverez à peu près le stockage de données hiérarchiques. Quant à savoir si c'est efficace, comme vous l'avez mentionné dans votre question ... dépend de la quantité de données que vous stockez, bien sûr.


Comme @Kim souligne dans les commentaires, vous pouvez obtenir un graphique très simplifiée en traitant les frères et sœurs comme des paires, plutôt que de nœuds individuels:

digraph G { 
    "A,B" -> C 
    "A,B" -> D 
    "A,B" -> E 
    "E,F" -> G 
    "E,F" -> H 

    "E,I" -> J 
    "E,I" -> K 
} 

Il est une solution évidente et élégante que je complètement oublié , bien qu'il reste un peu ambigu sur les relations fraternelles quand le chevauchement se produit (E encore).

simpler graph http://img35.imageshack.us/img35/8969/so2b.png

+0

Merci pour la bonne réponse - pas ce que je cherche pour ce projet, mais je vais certainement pouvoir l'utiliser. Dans mon exemple, C, D et E sont tous des descendants * directs * de A et de B (F et I sont des descendants de quelque chose d'autre, peut-être la même chose, mais pas nécessairement).Désolé pour le manque de clarté. –

+0

Je devrais plutôt dire que ce n'est peut-être pas ce que je cherche. –

+2

+1 pour la dédicace dans votre réponse – Matias

2

Je pense que devrait être plus facile d'écrire vos propres classes php, Wich sera beaucoup plus adapté à vos besoins. Peut-être quelque chose comme ça (pseudocode)

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

Le défi est d'écrire les méthodes pour gérer/mettre en place la structure complète. Persister aussi le niveau nbr devrait vous aider beaucoup dans votre cas. Vous avez déjà related questions in stackoverflow sur l'enregistrement de structures hiérarchiques dans une base de données.

Questions connexes