2009-10-05 8 views
0

J'ai deux tables où je stocke un arbre avec des niveaux commandés comme ceci:Comment insérer/supprimer/mettre à jour dans un arbre ordonné

Table: TreeData 
--------------- 
ID (int) (primary key) 
Data (string) 
Level (int) (not null) 


--------------------------------------------- 
Table: SubTree 
--------------- 
parentID (int) (foreign key #1 to TreeData.ID) 
childID (int) (foreign key #2to TreeData.ID) 
orderNumber (int) (not null) 

Maintenant, supposons que sur un certain niveau 1, j'ai 2 treedata entrées avec 1 2 et, tous les enfants d'une entrée treedata de ID sur 0 avec ID 0, dans un ordre logique:

TreeData      SubTree 
ID  Level    parentID childID  orderNumber 
---------------    ----------------------------------- 
0   0     
1   1     0   1   1 
2   1     0   2   2 
3   1     0   3   3 

maintenant, j'ai quelques données que je veux insérer dans la base de données sur le niveau 1, en tant qu'enfant de parent 0 mais "entre" enfants 1 et 2 de sorte que la base de données se termine comme ceci:

TreeData      SubTree 
    ID  Level    parentID childID  orderNumber 
    ---------------    ----------------------------------- 
    0   0     
    1   1     0   1   1 
    2   1     0   2   3   <-- order increased 1 
    3   1     0   3   4   <-- order increased 1 
    4   1     0   4   2 

Les données à la main sur laquelle je dois base où les nouvelles données se sont les suivantes:

Data (string) // the data itself 
Level (int) // the level it needs to be on 
parentID (int) // the id of the parent 
reference_orderNumber (int) // reference to the ordernumber 'this' data 
          // needs to come before or after 
placement (string) // either "before" or "after" 
        // in case of "after" the order number of 'this' data 
        // should be reference_orderNumber +1 
        // in case of "before" the order number of 'this' data 
        // should be equal to reference_odrderNumber 

Où et comment dois-je mettre en œuvre ce?

Le serveur SQL (j'utilise MS SQL Server 2008 Developer Edition) est-il capable de faire cette commande? (dans ce cas, je suppose que ce serait la méthode la plus rapide)

Ou ai-je vraiment besoin de récupérer toutes les données avec des numéros plus élevés via linq2sql, de le mettre à jour dans mon code C# et de tout replacer dans le serveur SQL?

Souhaitez-vous: Déplacement des données à l'intérieur du niveau (de Commande no 2 à 4, de sorte que 4 devient 3 et 3 devient 2)

suppression (suppression de numéro de commande 2, de sorte que 3 devient 2 et 4 devient 3)

Déplacer des données en dehors du niveau (à partir du niveau 2 (donc 4 devient 3 et 3 devient 2) niveau 1 à niveau supérieur/inférieur, donc ce niveau doit être réorganisé)?

Répondre

0

Cela peut être une note secondaire, mais vous ne voulez probablement pas faire de logique dans SQL et C#. Gardez-le dans un endroit, et il sera plus facile à maintenir. L'exception serait si vous avez vraiment besoin de la vitesse supplémentaire que vous pouvez ou ne pouvez pas en sortir en prenant le raccourci.

+0

Dans ma configuration actuelle, il y a une certaine récursivité, ce qui est déjà très lourd pour l'interaction base de données/application. alors oui, je préférerais que chaque étape soit exécutée le plus rapidement possible avec le moins de frais possible :) – ArjanW

+0

Si un autre développeur doit lire et comprendre le code, procéder avec prudence? :-) –

Questions connexes