6
votes

Base de données (Datamodel) pour créer une structure de dossier

Planification de la construction d'une structure basée sur un dossier en Java.

J'utiliserai un plug-in jquery pour l'interface graphique, donc je n'ai donc pas besoin d'informations sur la manière d'afficher la structure de dossier.

Je cherche la logique backend sur la façon dont les informations de dossier sont stockées , de sorte qu'il puisse être récupéré de manière rapide et efficace.

Chaque dossier aura plusieurs sous-dossiers. Dans un dossier de feuilles, nous devrions pouvoir accéder à la racine rapidement et efficacement

exemple: xxx

nouveaux dossiers pourraient être ajoutés au hasard. Dossier peut être renommé. Les dossiers peuvent être supprimés.

Ma question est la suivante:

Comment ces détails de dossier seront-ils stockés dans la base de données?

Encore une fois, je cherche un moyen rapide et efficace de stocker et de récupérer ces informations.


2 commentaires

Que voulez-vous dire, d'une feuille, accédez rapidement à la racine? la racine la racine ou le dossier contenant du dossier? Dans tous les cas, on dirait qu'un mécanisme normal parent_id fonctionnerait, mais sans savoir quels types d'opérations que vous faites, il est difficile de dire comment être efficace.


Et à quelle vitesse pensez-vous que cela doit être? Depuis que vous mentionnez JQuery, cela ressemble à une application Web. La vitesse du réseau sera narfe DB Lookup sur la base d'un identifiant indexé.


4 Réponses :


0
votes

Liste liée, qui est documentée dans l'API Java ici:

http://download.oracle.com/ Javase / 6 / Docs / API / Java / Util / LinkedList.html

En tant que structure d'informatique générale, lisez ceci:

http://en.wikipedia.org/wiki/linked_list

J'espère que cela aide


3 commentaires

En fait plus d'un arbre, comme "Arbre de répertoire".


@Davenewton Merci, mais je cherche des informations sur la manière de stocker les informations dans la base de données (modèle de données) afin que je puisse stocker / récupérer des données rapidement.


@ Kensenjohn Droite, et "rapidement" dépend de la façon dont vous essayez de récupérer.



0
votes

Pour la base de données, gardez-le simple. Une table nommée dossier - Les seules colonnes seraient ID, nom, parentid. Maintenant, chaque dossier aura un parent et certains dossiers auront des enfants. Charger des enfants: xxx


0 commentaires

6
votes

Pour stocker dans dB, la voie la plus simple et la plus simple est d'avoir un parent_folder_id pour chaque dossier / nœud. Cela devrait être assez bon dans la plupart des scénarios, surtout à construire la structure d'objet de dossier et à faire la base de manipulation sur le modèle d'objet.

dépend de votre exigence, il y a un cas assez courant que vous devez

  1. Découvrez tous les sous-dossiers sous certains dossiers
  2. Effectuez la recherche directement à partir de DB, par SQL.

    Si c'est ce que vous recherchez, il y a une méthode intéressante que vous avez peut-être un look: Chaque enregistrement de DB aura 2 champ de numéro d'extra, appelons-le à gauche et à droite

    supposons un arbre comme celui-ci: xxx

    Qu'est-ce qui va être stocké dans dB est xxx

    • Chaque noeud parent a laissé à gauche = le premier enfant gauche - 1, et à droite = la droite de la dernière enfant + 1
    • Le nœud de feuille aura laissé et droit être 2 numéro consécutif
    • la gauche de chaque nœud doit être = la droite de la frère de frère antérieure + 1, à droite = la gauche du frère suivante - 1

      Lorsque vous devez trouver tous les nœuds sous certains nœuds (N) par SQL, découvrez simplement tous les nœuds avec gauche> N.Left et Droite

      Vous pouvez facilement Effectuer insertion / Supprimer par la mise à jour en vrac par des nœuds connexes (pas une tâche difficile, le laisser à vous: p)

      Ce n'est probablement pas très sympathique, mais au cas où l'exigence que j'ai mentionnée est ce dont vous avez besoin, u peut envisager d'utiliser cette méthode.


0 commentaires

8
votes

C'est une bonne question, mais sans beaucoup de détails, il est difficile de parler de la "meilleure" solution.

Vous pouvez mapper ceci à la question abstraite de la façon de stocker un arbre N-Ary dans une relation relationnelle Base de données. P>

Voici certaines des variables qui affectent le problème: p>

  1. Quelle est la taille totale de la structure de répertoire? LI>
  2. Combien de VMS distincts effectuent écrit à la structure? LI>
  3. sont des opérations de déplacement fréquentes? LI>
  4. manque un sous-arbre entier une opération importante aussi? Li>
  5. Votre base de données prend-elle en charge l'arborescence des arbres ou avez-vous besoin d'une solution qui fonctionne avec une base de données relationnelle raisonnable? LI> ol>

    Le suivant suppose que votre base de données ne dispose pas de dispositions spéciales pour effectuer des promenades d'arbres. P>

    Il y a deux modèles de persistance pure pour les n-aryers. P>

    la Tout d'abord, c'est simplement écrire chaque nœud avec une référence parent: p> xxx pré>

    Cette approche simplifie le déplacement d'un dossier, mais supprime, les requêtes pour tous les sous-dossiers imbriqués et la recherche de la racine deviennent chères. p>

    Le deuxième modèle pur consiste à persister chaque relation ancestrale séparée des détails du dossier p> xxx pré>

    ici, le dossier / la nourriture / laiterie / le fromage / cheddar / cheddar produire p> xxx pré>

    cette approche est très coûteux pour les mouvements et un nouveau répertoire provoque des inserts d code>, où d code> est le distance de la racine. Mais une liste de sous-armes est une seule requête. Le chemin d'ascendance est également une seule requête; un commander par distance desc code> vous permettra de vous rendre rapidement à la racine et au premier dossier rapidement. P>

    Mais lire de manière étroite votre question, une variante de la première approche, en ajoutant simplement une racine aussi pourrait-elle Soyez la bonne approche pour vous: P>

    | NodeId | ParentId | RootId | Name       | ....
    |--------|----------|--------|------------|-----
    


1 commentaires

Merci, j'utiliserai une combinaison de votre réponse et de réponse fournie par @adrianshum. Depuis que je vais utiliser plus de réponse d'Adrian, je le marquerai comme la bonne réponse