Lykos22 Δημοσ. 17 Ιανουαρίου 2015 Δημοσ. 17 Ιανουαρίου 2015 (επεξεργασμένο) Έχει ασχοληθεί κανείς με hierarchical data και Site: Nested sets ? Θα ήθελα βοήθεια σχετικά με το πώς γίνεται το update σε ένα node, δηλαδή να μετακινώ το node μαζί με όλα τα child-nodes (αν έχει) σε οποιοδήποτε σημείο του tree θέλω. Έχω βρει αυτά τα άρθρα Site: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ Site: http://www.sitepoint.com/hierarchical-data-database-2/ που εξηγούν πώς λειτουργεί το μοντέλο, αλλά δεν αναφέρουν δυστυχώς κάτι σχετικό με αυτό που θέλω. Για παράδειγμα: Θέλω να μετακινήσω τα MP3 PLAYERS (και FLASH) από τα PORTABLE ELECTRONICS και να τα πάω κάτω από το PLASMA (επομένως το MP3 PLAYERS να έχει parent-node το PLASMA) ή ομοίως να μετακινήσω το LCD και να το πάω είτε δεξιά είτε αριστερά από το TELEVISIONS σαν ξεχωριστή κατηγορία μόνο του. Επεξ/σία 17 Ιανουαρίου 2015 από Lykos22
nucleus Δημοσ. 17 Ιανουαρίου 2015 Δημοσ. 17 Ιανουαρίου 2015 Από αυτό http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ CREATE TABLE category( category_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, parent INT DEFAULT NULL ); Ότι θες να μετακινήσεις απλώς αλλάζεις το parent. Θέλω να μετακινήσω τα MP3 PLAYERS (και FLASH) από τα PORTABLE ELECTRONICS και να τα πάω κάτω από το PLASMA (επομένως το MP3 PLAYERS να έχει parent-node το PLASMA) Αρχικά βρίσκεις το category_id της PLASMA. Μετά πας στην κατηγορία MP3 Players και στο πεδίο parent βάζεις το category_id που βρήκαμε αρχικά. Αν σε ενδιαφέρει η σειρά των υποκατηγοριών (δεξιά ή αριστερά) τότε πρέπει να βάλεις άλλο ένα πεδίο πχ DisplayOrder. To οποίο είναι ένας απλός αύξοντας αριθμός και με αυτό σορτάρεις τις υποκατηγορίες. Από το μικρότερο στο μεγαλύτερο το DisplayOrder από τα δεξιά προς τα αριστερά οι υποκατηγορίες (αν θες αυτό το αλλάζεις να σημαίνει το αντίθετο). ή ομοίως να μετακινήσω το LCD και να το πάω είτε δεξιά είτε αριστερά από το TELEVISIONS σαν ξεχωριστή κατηγορία μόνο του. Αρχικά κάνεις το parent της LCD ίδιο με το parent του TELEVISIONS (που είναι η κατηγορία ELECTRONICS). Αυτό έχει μετακινήσει την κατηγορία LCD στο ίδιο επίπεδο με τις TELEVISIONS και PORTABLE ELECTRONICS. Για να μπει η LCD δεξιά από την TELEVISIONS θα πρέπει να έχει μικρότερο DisplayOrder απο αυτήν (άραγε τι πρέπει να συμβεί αν το DisplayOrder της TELEVISIONS είναι ένα). Για να μπει αριστερά πρέπει να έχει μεγαλύτερο DisplayOrder.
Lykos22 Δημοσ. 17 Ιανουαρίου 2015 Μέλος Δημοσ. 17 Ιανουαρίου 2015 Συγνώμη αλλά αυτό που αναφέρεις είναι το Adjacency Model, ενώ εγώ θέλω το Nested Set Model. Αν κοιτάξεις λίγο παρακάτω το αναφέρει. Adjacency Model CREATE TABLE category( category_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, parent INT DEFAULT NULL ); Στο Nested Set Model ο πίνακας είναι ως εξής: CREATE TABLE nested_category ( category_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, lft INT NOT NULL, rgt INT NOT NULL, parent_id INT // προαιρετικό ); Το parent_id το βάζω προαιρετικά, αλλά όπως αναφέρει και στα άρθρα δεν χρειάζεται γιατί στην ουσία "κάνεις παιχνίδι" με τα left & right. Προφανώς στο Nested Set Model δεν χρειάζεται να αλλάξεις μόνο το parent_id όπως ανέφερες αλλά χρειάζεται να αλλάξεις και τις τιμές των left και right (lft και rgt αντίστοιχα) όχι μόνο του node που θες να μετακινηθεί, αλλά και των υπλοίπων για να είναι σωστό το tree. Και το DisplayOrder δεν νομίζω ότι χρειάζεται επίσης.
nucleus Δημοσ. 18 Ιανουαρίου 2015 Δημοσ. 18 Ιανουαρίου 2015 This design can be applied to a typical tree as well: When working with a tree, we work from left to right, one layer at a time, descending to each node’s children before assigning a right-hand number and moving on to the right. This approach is called the modified preorder tree traversal algorithm. Για την μετακίνηση πας τον κόμβο εκεί που θέλεις και μετά απλώς ξαναϋπολογίζεις τα left και right σύμφωνα με τους κανόνες. Υποθέτω για όλο το δέντρο.
Lykos22 Δημοσ. 19 Ιανουαρίου 2015 Μέλος Δημοσ. 19 Ιανουαρίου 2015 Για την μετακίνηση πας τον κόμβο εκεί που θέλεις και μετά απλώς ξαναϋπολογίζεις τα left και right σύμφωνα με τους κανόνες. Υποθέτω για όλο το δέντρο. Ωραία, θα μπορόυσες να μου δώσεις τότε λίγο πιο αναλυτικές οδηγίες σχετικά με τον υπολογισμό των left και right του node και του tree? Τι queries θα χρειαστεί να δημιουργήσω? γνωρίζεις να μου αναφέρεις κάποια pseudo-queries, όπως αναφέρει και στα σχετικά άρθρα που ανέφερα???
nucleus Δημοσ. 19 Ιανουαρίου 2015 Δημοσ. 19 Ιανουαρίου 2015 Είσαι σε ένα Node. Είναι ο πιο αριστερός node από τα children του parent του? Αν ναι τότε το LEFT του είναι ίσο με το LEFT του parent του +1. Αν δεν είναι τότε το LEFT του είναι ίσο με το RIGHT του child node που βρίσκεται αμέσως πιο αριστερά από αυτόν +1. Σε κάθε κόμβο έχεις 2 πιθανές περιπτώσεις να μετακινηθείς και να επιλέξεις τον επόμενο node. Αν έχει children πας πρώτα στα παιδιά του. Αν δεν έχει τότε πας δεξιά βάζοντας το RIGHT του πριν. Αν δεν υπάρχει πιο δεξιό node στο ίδιο επίπεδο τότε πας πιο πάνω. Θέλω να μετακινήσω τα MP3 PLAYERS (και FLASH) από τα PORTABLE ELECTRONICS και να τα πάω κάτω από το PLASMA (επομένως το MP3 PLAYERS να έχει parent-node το PLASMA) Φτάνεις στην κατηγορία PLASMA (LEFT = 7). Έχει child το MP3 Players οπότε πας προς τα κάτω. Βάζεις το LEFT του MP3 Players (LEFT = 8). Η κατηγορία MP3 Players έχει child την κατηγορία FLASH άρα πας προς τα κάτω. Βάζεις το LEFT του FLASH (LEFT = 9). Το FLASH δεν έχει children άρα πάμε δεξιά (RIGHT = LEFT του FLASH + 1),Το parent του FLASH ,η κατηγορία MP3 Players,όμως δεν έχει άλλα children εκτός από την κατηγορία FLASH στο ίδιο επίπεδο. Οπότε βάζεις την τιμή RIGHT της MP3 Players LEFT της MP3 Players + 1. Ανεβαίνεις ακόμα πιο πάνω,φτάνεις στην PLASMA. Δεν έχει children στο ίδιο επίπεδο με την MP3 Players οπότε ρυθμίζεις το RIGHT της PLASMA (RIGHT = 12). Δεν έχει άλλη δεξιά άρα ανεβαίνεις ακόμα πιο πάνω στην TELEVISIONS.Βάζεις το RIGHT της TELEVISIONS (RIGHT = 13). Μετά πας στην PORTABLE ELECTRONICS,βάζεις το LEFT της LEFT = 14. Και μετά αρχίζεις να κατεβαίνεις στα children της. Τελειώνεις την αρίθμηση όταν βάλεις και το RIGHT του root node. ή ομοίως να μετακινήσω το LCD και να το πάω είτε δεξιά είτε αριστερά από το TELEVISIONS σαν ξεχωριστή κατηγορία μόνο του. Αν το βάλεις δεξιά απο την TELEVISIONS τότε LEFT της LCD = 2. Μιας και δεν έχει children τότε RIGHT = 3. Μετά κινείσαι δεξιά στην TELEVISIONS. LEFT της TELEVISIONS = 4. Αρχίζεις και κατεβαίνεις στα children της TELEVISIONS αλλάζοντας τα LEFT και RIGHT. Ομοίως και στην PORTABLE ELECTRONICS. Αν το βάλεις αριστερά από την TELEVISIONS τότε το LEFT της LCD θα είναι το (RIGHT της TELEVISIONS +1) και μιας και δεν έχει παιδιά το RIGHT της LCD θα είναι το (LEFT της + 1). Συνεχίζεις και στην PORTABLE ELECTRONICS. Δες και αυτό το σχήμα. Δεν έχω ιδέα αν μπορείς να το κάνεις σε "μια" SQL εντολή.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα