The Nested Tree Model

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

The Nested Tree Model

Δημοσίευση από kapoios001 » 22 Απρ 2011 13:53

Γεια σας,

Προσπαθώ να χρησιμοποιήσω το Nested Tree Model για να έχω unlimited βάθος στις κατηγορίες μιας εφαρμογής.

Ο πίνακας της βάσης product_categories_depth έχει: parent_ID, category_ID, nleft, nright, nlevel.

Βάση με αυτά που διάβασα στο παραπάνω tutorial έγραψα τον ακόλουθο κώδικα:

Κώδικας: Επιλογή όλων

			$nleft = $this->getMaxLeftID()+1;
			$descendants = count($this->getCategoryDepth($belongs_to));

			if ($descendants == '0' || $belongs_to == '0') { $nright = $nleft + 1; }
			else { $nright = $nleft + ($descendants * 2) + 1; }

			$sql3 = "INSERT INTO product_categories_depth (parent_ID, category_ID, nleft, nright, nlevel)
					VALUES ('".(int) $belongs_to."', '".(int) $insert_id."', '".(int) $nleft."', '".(int) $nright."', '".((int)$descendants+1)."');";

			if ( ! ( $result3 = mysql_query($sql3) ) ) {
				error_msg('Could not execute MySQL query.'.mysql_error());
			}
Περνάει τις τιμές κανονικά αλλά υποψιάζομαι ότι δεν είναι οι σωστές που πρέπει να μπουν.

Ας πούμε αυτός έτσι όπως το έκανε έχει άλλες τιμές και σε μένα στον πίνακα της βάσης μπήκαν άλλες τιμές.

Μάλλον πρέπει να κάνω και άλλους υπολογισμούς και άλλα updates ώστε να δουλέψει σωστά. Έχω κολλήσει σε αυτό, αν μπορείτε να με βοηθήσετε θα το εκτιμούσα πολύ.

Ευχαριστώ.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

The Nested Tree Model

Δημοσίευση από korgr » 22 Απρ 2011 16:19

Αν θες να το υλοποιήσεις σύμφωνα με το «The Adjacency List Model» μπορείς να δεις το tutorial που δημοσίευσα στο http://www.freestuff.gr/forums/viewtopic.php?t=39468

kapoios001
Δημοσιεύσεις: 403
Εγγραφή: 17 Φεβ 2011 12:26

The Nested Tree Model

Δημοσίευση από kapoios001 » 22 Απρ 2011 16:22

Να 'σαι καλά ευχαριστώ πάρα πολύ.

Το είδα πριν λίγο και μου έλυσες το πρόβλημα φίλε!

Χίλια ευχαριστώ! Συγχαρητήρια για το καταπληκτικό tutorial!

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

The Nested Tree Model

Δημοσίευση από pimpogio » 23 Απρ 2011 01:15

αμα χρησιμοποιηεις postgresql/msql/oracle ktlp (μια databse που υποστηριζει δηλαδη αναδρομικα ερωτηματα) πηγενε με το adjacency list model

αμα χρησιμοποιεις mysql ή sqlite πηγενε με την ελληνική πατέντα του
nested set model

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

The Nested Tree Model

Δημοσίευση από korgr » 23 Απρ 2011 10:44

pimpogio τα πάντα εξαρτώνται από τον συνολικό αριθμό των nodes.
Εγώ με mysql έχω δουλέψει menus μέχρι και 3000 nodes με adjacency list model, χωρίς κανένα αισθητό delay. Θεωρώ πως τα ανεκτά όρια είναι αρκετά πιο πάνω από το νούμερο που ανέφερα.
Αν αναλογιστείς πως το 90% των αναγκών είναι για κατηγοριοποιήσεις με λιγότερα από 500 nodes, το adjacency list model είναι βασιλιάς λόγω της ευκολίας κατανόησης του!

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

The Nested Tree Model

Δημοσίευση από pimpogio » 26 Απρ 2011 09:46

παιζει σημασια αν το dbms να υποστηριζει
recursive queries η οχι.
Αν υποστηριζει τοτε πας με το adjacency list model που ειναι κατα πολυ ποιο γρηγορο...

Αν δεν υποστηριζει πας με το nested set model

πχ στην postgresql καλη επιλογη ειναι το adjacency list model
στην mysql αντιθετα πας με το nested set model
γιατι δεν υποστηριζει αναδρομικα queries...

με λιγα λογια ...
postgresql,mssql,oracle -> adjacency list model(graph)
mysql,sqlite -> nested set model(tree)

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

The Nested Tree Model

Δημοσίευση από korgr » 26 Απρ 2011 10:35

pimpogio έγραψε:παιζει σημασια αν το dbms να υποστηριζει
recursive queries η οχι.
Αν υποστηριζει τοτε πας με το adjacency list model που ειναι κατα πολυ ποιο γρηγορο...

Αν δεν υποστηριζει πας με το nested set model

πχ στην postgresql καλη επιλογη ειναι το adjacency list model
στην mysql αντιθετα πας με το nested set model
γιατι δεν υποστηριζει αναδρομικα queries...

με λιγα λογια ...
postgresql,mssql,oracle -> adjacency list model(graph)
mysql,sqlite -> nested set model(tree)

Λάθος

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

The Nested Tree Model

Δημοσίευση από jpk » 26 Απρ 2011 18:07

Αν έχετε καμία όρεξη να ακούσετε και κάποια άλλη άποψη …. Είναι πιο χρήσιμο ο προγραμματισμός να μην έχει να έχει να κάνει με την βάση δεδομένων που χρησιμοποιείς. Τον ίδιο κώδικα που χρησιμοποιείς για DB2 πρέπει να τον χρησιμοποιείς για MySql και όλα να είναι σωστά. Τα ίδια ερωτήματα έχουν απαντηθεί (με άλλη διατύπωση) εκατοντάδες φορές. Ουσιαστικά αυτό που θέλεις είναι μια λίστα από objects που εμπεριέχει και κλειδιά. Τα κλειδιά κάποια φορά μπορεί να είναι ένα property από μόνο του ή κάποιο αποτέλεσμα συμπεριφοράς των ιδιοτήτων. Έχω την εικόνα ότι μάλλον ότι δεν θα συμφωνείτε ( αν καταναλώσετε ένα λεπτό να καταλάβετε τι λέω) αλλά μπορεί από την πολυφωνία να ανοίξει κανενός το μυαλό.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

The Nested Tree Model

Δημοσίευση από korgr » 26 Απρ 2011 18:56

jpk αν μπορέσεις να συνταξεις λίγο πιο κατανοητά αυτά που θες να πεις, ίσως καταλάβουμε αν συμφωνούμε ή αν διαφωνούμε.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

The Nested Tree Model

Δημοσίευση από jpk » 26 Απρ 2011 19:17

Όπως και να τα πεις .. στον τρόπο που το κάνεις retrieve το ίδιο είναι. Έχεις μια βάση που είναι φίδι που λέγαν οι παλιοί ή «self referenced». Έχω ακούσει και διαβάσει τριάντα πέντε απίθανους τρόπους για να έχεις πρόσβαση σε αυτή σε PHP αλλά όχι σε JAVA.Τι ξέρουν εκεί που δεν ξέρουν εδώ?... Ότι μπορείς να πάρεις όλα τα objects με ένα quiry και να τους δώσεις id … εκτός από το id που έχουν στην βάση μπορείς να ορίσεις ότι θες … και να το παίρνει με reflection. Το κόστος αυτού το reflection όταν οι ιδιότητες του αντικειμένου είναι 1 προς ένα με την βάση είναι πολύ μικρότερο από κάθε αλγόριθμο. Άρα μπορείς να έχεις μια λίστα από αντικείμενα και να πεις getSublistByKey ή getUniqueByKey…

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

The Nested Tree Model

Δημοσίευση από korgr » 26 Απρ 2011 20:51

korgr έγραψε:Αν αναλογιστείς πως το 90% των αναγκών είναι για κατηγοριοποιήσεις με λιγότερα από 500 nodes, το adjacency list model είναι βασιλιάς λόγω της ευκολίας κατανόησης του!
Ξέρεις πόση είναι η διαφορά του delay (ms) σε αυτό που αναφέρω ανωτέρω από την πιο ενδεδειγμένη θεωρητικά μέθοδο σε σχέση με το adjacency list model με mysql?

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

The Nested Tree Model

Δημοσίευση από jpk » 26 Απρ 2011 21:12

Δεν το έχω μετρήσει korgr και υπάρχει περίπτωση και να έχεις και δίκιο ότι είναι πιο γρήγορο το adjacency list model σε MySql (σε πια engine?) αν και αμφιβάλω. Είπα ότι ένα από αυτά που μετράμε είναι ο κώδικας να είναι χρήσιμος ανεξαρτήτως βάσης και καθαρός. Τώρα αν έχεις δίκιο ότι είναι πιο γρήγορο σε MySql θα το δοκιμάσω αύριο με μια βαριά db φίδι … και να δω πραγματικά πιο είναι πιο γρήγορο τα αποτελέσματα θα τα δημοσιεύσω εδώ… (δεν θα παίξω ολοκληρωμένο object list model απλά μια κλάση που θα κάνει αυτή την δουλεία που θα επισυνάψω). Πραγματικά δεν ξέρω πιο θα είναι το αποτέλεσμα … (όσο μεγαλώνεις και έχεις κάνει τα ίδια πράγματα χιλιάδες φορές το κακό είναι ότι σκληραίνει η προσαρμοστικότητα της αντίληψης… αν έχω κερδίσει κάτι από τα σχετικά forums είναι ότι μπαίνω στην διαδικασία να δω και άλλους τρόπους και να τους μετρήσω) … λοιπόν αύριο δύο προγράμματα …

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

The Nested Tree Model

Δημοσίευση από korgr » 26 Απρ 2011 21:53

Θα ήταν πολύ καλό να έκανες αυτή την μέτρηση, είμαι και εγώ περίεργος.
Δεν υποστηρίζω πως είναι πιο γρήγορο το adjacency list model σε mysql.
Υποστηρίζω πως στην πλειονότητα των περιπτώσεων που το χρειαζόμαστε σε ένα site, η διαφορά σε χρόνους είναι πολύ μικρή ώστε να αποτελεί κριτήριο επιλογής μεθόδου.
Αντίθετα το πόσο εύκολη είναι η υλοποίηση ή όχι, είναι ένας παράγοντας που πιστεύω λαμβάνεται περισσότερο υπ' όψη.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

The Nested Tree Model

Δημοσίευση από pimpogio » 26 Απρ 2011 23:29

καταρχην οτι λεω το λεω για την db μονο χωρις υπαρξη php η java ktlp...
το adjacency list model ειναι σαφως πολυ γρηγοροτερο σχεδον σε ολα
οταν εχεις μια db που υποστηριζει recursive queries.
Αμα δεν εχεις database που να υποστηριζει recursive queries
πρεπει να κανεις recursion στην php ή τη java που ειναι αλλο καπελο..
Εγω μιλαω για σκετη την database χωρις να εχεις μεσαζοντα καποια γλωσσα προγραμματισμου...

Επισης το adjacency list model ειναι γραφος επομενως ειναι μια πολυ γενικοτερη περιπτωση
του δεντρου αρα ειναι πολυ ποιο ευελικτο...

οσο για την ευκολια ειναι ποιο απλο το adjacency list model αλλα λιγο ποιο απλο
οχι πολυ και το nested set model αμα δεις οπτικα ενα σχημα το πιανεις αμεσως...

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

The Nested Tree Model

Δημοσίευση από jpk » 28 Απρ 2011 00:20

Λοιπόν το έκανα το τεστ. Το test1 είναι αυτό που περιγράφεται στο http://www.freestuff.gr/forums/viewtopic.php?t=39468 - Adjacency List Model . Το test2 είναι ένα απλό objects list model. Το αποτέλεσμα σε χρόνους είναι με μέσο όρο στα 30 χτυπήματα και σε δευτερόλεπτα . Για βάση χρησιμοποιήθηκαν 445 κατηγορίες καταλόγου είναι αρκετά πολυεπίπεδο (π.χ. κατηγορία Computers & Internet)

Test1: 0.84
Test2: 0.15


Μπορείτε να κατεβάσετε και να κάνετε και εσείς το test από την διεύθυνση που ακολουθεί, (διαβάστε το readme.txt).
https://rapidshare.com/files/459487848/test.zip

Συμφωνώ με τον korgr περί εύκολης υλοποίησης. Αλλά για εμένα το εύκολο είναι σχετικό με το ποιος το κάνει και γιατί. Ποτέ δεν θα πρότεινα καν OOP (πόσο μάλλον MVC) σε κάποιον που απλά θέλει να κάνει κάτι απλό στο site του και δεν τρελαίνεται για τον προγραμματισμό. Σε κάποιον που θα το κάνει πάνω από 2 φορές είναι πιο εύκολο να περάσει το learning curve.

Συμφωνώ και με τον pimpogio αλλά για προγραμματισμό μιλάμε κυρίως οπότε το «χωρις υπαρξη php η java ktlp.» δεν ισχύει στο παράδειγμα που δίνω.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης