Βελτιστοποίηση ερωτήματα για το επόμενο και το προηγούμενο στοιχείο

ψήφοι
28

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

Ας πούμε ότι χτίζουμε μια ιστοσελίδα για ένα φανταστικό μανάβη. Εκτός από τις σελίδες HTML του, κάθε εβδομάδα, θέλει να δημοσιεύσει μια λίστα με τις ειδικές προσφορές στην ιστοσελίδα του. Θέλει αυτές τις προσφορές να διαμένουν σε ένα πραγματικό πίνακα της βάσης δεδομένων, και οι χρήστες πρέπει να είναι σε θέση να ταξινομήσετε τις προσφορές με τρεις τρόπους.

Κάθε στοιχείο πρέπει επίσης να έχει μια σελίδα λεπτομέρεια με περισσότερες, έγγραφες πληροφορίες σχετικά με την προσφορά και την «προηγούμενη» και «επόμενο» κουμπιά. Η «προηγούμενη» και «επόμενο» κουμπιά πρέπει να επισημάνω στις γειτονικές εγγραφές ανάλογα με την ταξινόμηση που ο χρήστης είχε επιλέξει για τη λίστα .

alt κείμενο http://www.pekkagaiser.com/stuff/Sort.gif;

Προφανώς, το κουμπί «επόμενο» για «Ντομάτες, Κατηγορίας Ι» πρέπει να είναι «Μήλα, κατηγορίας 1» και στο πρώτο παράδειγμα, «αχλάδια, κατηγορίας Ι» στο δεύτερο, και κανένας στο τρίτο.

Η εργασία κατά την άποψη λεπτομέρεια είναι να καθορίσει τα επόμενα και προηγούμενα στοιχεία, χωρίς να τρέχει ένα ερώτημα κάθε φορά , με τη σειρά ταξινόμησης της λίστας ως η μόνη διαθέσιμη πληροφορία (Ας πούμε παίρνουμε ότι μέσω μιας παραμέτρου GET ?sort=offeroftheweek_price, και να αγνοήσει τις επιπτώσεις στην ασφάλεια) .

Προφανώς, απλά περνώντας τα αναγνωριστικά των επόμενων και προηγούμενων στοιχείων ως παράμετρος είναι η πρώτη λύση που έρχεται στο μυαλό. Μετά από όλα, γνωρίζουμε ήδη τις ταυτότητες σε αυτό το σημείο. Όμως, αυτό δεν είναι μια επιλογή εδώ - θα μπορούσε να λειτουργήσει σε αυτό το απλουστευμένο παράδειγμα, αλλά όχι σε πολλές από τις πραγματικές περιπτώσεις χρήσης μου.

Τρέχουσα προσέγγισή μου στο CMS μου χρησιμοποιεί κάτι που έχω με το όνομα «διαλογή cache». Όταν ένας κατάλογος έχει φορτωθεί, θα αποθηκεύουν τις θέσεις στοιχείο σε εγγραφών σε έναν πίνακα που ονομάζεται sortingcache.

name (VARCHAR)             items (TEXT)

offeroftheweek_unsorted    Lettuce; Tomatoes; Apples I; Apples II; Pears
offeroftheweek_price       Tomatoes;Pears;Apples I; Apples II; Lettuce
offeroftheweek_class_asc   Apples II;Lettuce;Apples;Pears;Tomatoes

Προφανώς, η itemsστήλη είναι πραγματικά γεμάτη με αριθμητικό ταυτότητες.

Στη σελίδα λεπτομερειών, έχω τώρα πρόσβαση στο κατάλληλο sortingcacheαρχείο, φέρω την itemsστήλη, να εκραγεί το, ψάξτε για το τρέχον αναγνωριστικό στοιχείο, και να επιστρέψετε το προηγούμενο και το επόμενο γείτονα.

array(current   => Tomatoes,
      next      => Pears,
      previous  => null
      );

Αυτό είναι προφανώς δαπανηρό, εργάζεται για περιορισμένο αριθμό μόνο αρχεία και δημιουργεί περιττά στοιχεία, αλλά ας υποθέσουμε ότι στον πραγματικό κόσμο, το ερώτημα για να δημιουργήσουν τις λίστες είναι πολύ ακριβό (είναι), τρέχει σε κάθε λεπτομερή προβολή από το ερώτημα, και κάποια προσωρινή αποθήκευση είναι απαραίτητη.

Οι ερωτήσεις μου:

  • Πιστεύετε ότι αυτή είναι μια καλή πρακτική για να βρείτε τις γειτονικές εγγραφές για την αλλαγή παραγγελίες ερώτημα;

  • Ξέρετε καλύτερες πρακτικές όσον αφορά τις επιδόσεις και την απλότητα; Ξέρετε κάτι που κάνει αυτό το εντελώς ξεπερασμένο;

  • Στη θεωρία προγραμματισμού, είναι ένα όνομα για αυτό το πρόβλημα;

  • Είναι το όνομα «Ταξινόμηση cache» είναι κατάλληλο και κατανοητό για αυτήν την τεχνική;

  • Υπάρχουν αναγνωρισμένα, κοινά πρότυπα για να λύσει αυτό το πρόβλημα; Πώς ονομάζονται?

Σημείωση: Η ερώτησή μου δεν είναι για την οικοδόμηση του καταλόγου, ή πώς να εμφανίσετε την προβολή λεπτομερειών. Αυτά είναι μόνο παραδείγματα. Η ερώτησή μου είναι η βασική λειτουργία του καθορισμού των γειτόνων του ρεκόρ, όταν μια εκ νέου ερώτημα είναι αδύνατη, και ο γρηγορότερος και οικονομικότερος τρόπος για να φτάσετε εκεί.

Αν κάτι δεν είναι σαφές, παρακαλώ αφήστε ένα σχόλιο και θα αποσαφηνίσει.

Ξεκινώντας μια γενναιοδωρία - ίσως υπάρχει κάποια περισσότερες πληροφορίες για αυτό εκεί έξω.

Δημοσιεύθηκε 22/02/2010 στις 12:06
πηγή χρήστη
Σε άλλες γλώσσες...                            


11 απαντήσεις

ψήφοι
-3

Έτσι, έχετε δύο εργασίες:

  1. οικοδομήσουμε ταξινομημένη λίστα των στοιχείων (Επιλέγει με διαφορετικές ORDER BY)
  2. δείχνουν λεπτομέρειες για κάθε στοιχείο (SELECT στοιχεία από τη βάση δεδομένων με δυνατό caching).

Ποιο είναι το πρόβλημα?

PS: αν διέταξε λίστα μπορεί να είναι πολύ μεγάλο το μόνο που χρειάζεται λειτουργικότητα PAGER εφαρμοστεί. Θα μπορούσαν να υπάρχουν διαφορετικές εφαρμογές, π.χ. μπορεί να θέλετε να προσθέσετε «ΟΡΙΟ 5» στο ερώτημα και να παρέχει «Εμφάνιση επόμενα 5» κουμπί. Όταν αυτό το κουμπί είναι πατημένο, κατάσταση όπως «ΟΠΟΥ τιμή <0,89 ΟΡΙΟ 5» προστίθεται.

Απαντήθηκε 22/02/2010 στις 15:04
πηγή χρήστη

ψήφοι
16

Εδώ είναι μια ιδέα. Θα μπορούσατε να απαλλαγούν από τις δαπανηρές διαδικασίες για την ενημέρωση όταν τα ένθετα μπακάλη / ανανεώσεις νέες προσφορές και όχι όταν ο τελικός χρήστης επιλέγει τα δεδομένα για να δείτε. Αυτό μπορεί να φαίνεται σαν μια μη-δυναμικό τρόπο για να χειριστεί τα δεδομένα του είδους, αλλά μπορεί να αυξήσει την ταχύτητα. Και, όπως γνωρίζουμε, υπάρχει πάντα ένας συμβιβασμός μεταξύ της απόδοσης και άλλων κωδικοποίησης παράγοντες.

Δημιουργήστε έναν πίνακα για να πραγματοποιήσει την επόμενη και την προηγούμενη για κάθε προσφορά και κάθε επιλογή ταξινόμησης. (Εναλλακτικά, μπορείτε να αποθηκεύσετε αυτή στον πίνακα προσφοράς, αν θα έχετε πάντα τρεις επιλογές ταξινόμησης - ταχύτητα ερώτημα είναι ένας καλός λόγος για να Αποκανονικοποιήστε βάση δεδομένων σας)

Έτσι θα έχετε αυτές τις στήλες:

  • Ταξινόμηση Τύπος (άνευ διαλογής, Τιμή, Κατηγορία και Τιμή Φθίνουσα)
  • ID Προσφορά
  • Προηγούμενο ID
  • επόμενο ID

Όταν οι πληροφορίες λεπτομέρεια για τη σελίδα προσφοράς λεπτομέρεια ερωτάται από τη βάση δεδομένων, η NextID και PrevID θα είναι μέρος των αποτελεσμάτων. Έτσι, θα χρειαστεί μόνο ένα ερώτημα για κάθε σελίδα λεπτομερειών.

Κάθε φορά που μια προσφορά εισάγεται, ενημέρωση ή διαγραφή, θα πρέπει να εκτελέσετε μια διαδικασία η οποία επικυρώνει την ακεραιότητα / ακρίβεια του πίνακα sorttype.

Απαντήθηκε 22/02/2010 στις 20:20
πηγή χρήστη

ψήφοι
1

Δεν είμαι σίγουρος αν κατάλαβα σωστά, οπότε αν δεν είναι, απλά πες μου?)

Ας πούμε, ότι οι Givens είναι το ερώτημα για την ταξινομημένη λίστα και την τρέχουσα offset στον εν λόγω κατάλογο, δηλαδή έχουμε ένα $queryκαι ένα $n.

Μια πολύ προφανής λύση για την ελαχιστοποίηση των ερωτημάτων, θα ήταν να φέρω όλα τα δεδομένα ταυτόχρονα:

list($prev, $current, $next) = DB::q($query . ' LIMIT ?i, 3', $n - 1)->fetchAll(PDO::FETCH_NUM);

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

Αλλά καθώς αυτή η λύση είναι πολύ απλή, υποθέτω κατάλαβα κάτι.

Απαντήθηκε 07/02/2011 στις 20:31
πηγή χρήστη

ψήφοι
2

Είχα εφιάλτες με αυτό, καθώς και. Τρέχουσα προσέγγιση σας φαίνεται να είναι η καλύτερη λύση, ακόμη και για τους καταλόγους των 10k στοιχεία. Προσωρινή αποθήκευση τα αναγνωριστικά της προβολής λίστας στη σύνοδο http και στη συνέχεια, χρησιμοποιώντας ότι για την εμφάνιση της (εξατομικευμένες για τρέχοντα χρήστη) προηγούμενο / επόμενο. Αυτό λειτουργεί καλά ειδικά όταν υπάρχουν πάρα πολλοί τρόποι για να φιλτράρετε και να ταξινομήσετε τον αρχικό κατάλογο των αντικειμένων και όχι μόνο 3.
Επίσης, αποθηκεύοντας όλη τη λίστα αναγνωριστικά μπορείτε να πάρετε για να εμφανιστεί ένα "you are at X out of Y"κείμενο βελτίωση της χρηστικότητας.
JIRA το προηγούμενο / επόμενο

Με την ευκαιρία, αυτό είναι ό, τι JIRA κάνει επίσης.

Για να απαντήσει άμεσα στις ερωτήσεις σας:

  • Ναι είναι καλή πρακτική, διότι κλίμακες χωρίς κωδικό επιπρόσθετη πολυπλοκότητα όταν το φίλτρο / ταξινόμηση και τύπους στοιχείων κόρακα πιο περίπλοκη. Είμαι αυτό που χρησιμοποιούν σε ένα σύστημα παραγωγής με 250k άρθρα με το «άπειρο» παραλλαγές φίλτρου / ταξινόμησης. Κοπή τα cacheable αναγνωριστικά έως 1000 είναι επίσης μια πιθανότητα δεδομένου ότι ο χρήστης θα πιθανότατα ποτέ κλικ σε προηγούμενο ή επόμενο περισσότερες από 500 φορές (Αυτός θα πιθανότατα να πάει πίσω και να περιορίσετε την αναζήτηση ή σελιδοποίηση).
  • Δεν ξέρω έναν καλύτερο τρόπο. Αλλά αν τα είδη όπου περιορισμένες και αυτό ήταν ένα δημόσιο χώρο (χωρίς συνεδρία http), τότε θα ήμουν πιθανότατα Αποκανονικοποιήστε.
  • Δεν ξέρω.
  • Ναι, διαλογή μνήμη cache ακούγεται καλό. Στο έργο μου εγώ αποκαλώ «προηγούμενο / επόμενο στα αποτελέσματα αναζήτησης» ή «πλοήγηση στα αποτελέσματα αναζήτησης».
  • Δεν ξέρω.
Απαντήθηκε 07/02/2011 στις 21:04
πηγή χρήστη

ψήφοι
2

Σε γενικές γραμμές, Αποκανονικοποιήστε τα δεδομένα από τους δείκτες. Μπορούν να αποθηκευτούν στις ίδιες γραμμές, αλλά εγώ ανακτήσει σχεδόν πάντα αναγνωριστικά αποτέλεσμα μου, τότε κάνει ένα ξεχωριστό ταξίδι για τα δεδομένα. Το γεγονός αυτό καθιστά την προσωρινή αποθήκευση των δεδομένων είναι πολύ απλή. Δεν είναι τόσο σημαντικό σε PHP, όπου η καθυστέρηση είναι χαμηλό και το υψηλό εύρος ζώνης, αλλά μια τέτοια στρατηγική είναι πολύ χρήσιμο όταν έχετε μια υψηλή λανθάνουσα κατάσταση, χαμηλού εφαρμογή το εύρος ζώνης, όπως μια ιστοσελίδα AJAX, όπου μεγάλο μέρος του χώρου αποδίδεται σε JavaScript.

Πάντα προσωρινή αποθήκευση των καταλόγων των αποτελεσμάτων, καθώς και τα ίδια τα αποτελέσματα ξεχωριστά. Αν μη τι άλλο επηρεάζει τα αποτελέσματα ενός ερωτήματος καταλόγου, η μνήμη cache των αποτελεσμάτων κατάλογος ανανεώνεται. Αν μη τι άλλο επηρεάζει τα ίδια τα αποτελέσματα, τα συγκεκριμένα αποτελέσματα ανανεώνονται. Αυτό μου επιτρέπει να ενημερώσετε είτε ένα χωρίς να χρειάζεται να αναγεννηθούν τα πάντα, με αποτέλεσμα την αποτελεσματική προσωρινή αποθήκευση.

Από τους καταλόγους μου των αποτελεσμάτων σπάνια αλλάζουν, θα δημιουργήσει όλες τις λίστες ταυτόχρονα. Αυτό μπορεί να κάνει η αρχική αντίδραση ελαφρώς πιο αργή, αλλά απλοποιεί την προσωρινή μνήμη αναζωογονητικό (όλοι οι κατάλογοι να αποθηκεύονται σε μια μόνο εγγραφή της κρυφής μνήμης).

Επειδή έχω ολόκληρη τη λίστα προσωρινής αποθήκευσης, είναι ασήμαντο για να βρείτε τις γειτονικές στοιχεία, χωρίς αναθεώρηση της βάσης δεδομένων. Με λίγη τύχη, τα στοιχεία για τα εν λόγω στοιχεία θα αποθηκεύονται προσωρινά. Αυτό είναι ιδιαίτερα χρήσιμο κατά την ταξινόμηση των δεδομένων σε JavaScript. Αν έχω ήδη ένα αντίγραφο προσωρινής αποθήκευσης του υπολογιστή-πελάτη, μπορώ να καταφύγουν αμέσως.

Για να απαντήσουμε στις ερωτήσεις σας συγκεκριμένα:

  • Ναι, είναι μια φανταστική ιδέα για να ανακαλύψει τους γείτονες μπροστά από το χρόνο, ή ό, τι πληροφορίες ο πελάτης είναι πιθανό να έχουν πρόσβαση σε επόμενο, ειδικά αν το κόστος είναι χαμηλό τώρα και το κόστος για να υπολογίσει εκ νέου είναι υψηλό. Στη συνέχεια, είναι απλά ένας συμβιβασμός επιπλέον προ-υπολογισμό και την αποθήκευση σε σχέση με την ταχύτητα.
  • Όσον αφορά τις επιδόσεις και την απλότητα, την αποφυγή δέσιμο πράγματα μαζί που είναι λογικά διαφορετικά πράγματα. Οι δείκτες και τα δεδομένα είναι διαφορετικά, είναι πιθανό να αλλάξει σε διαφορετικές χρονικές στιγμές (π.χ. προσθέτοντας ένα νέο δεδομένο θα επηρεάσει τα ευρετήρια, αλλά δεν τα υπάρχοντα δεδομένα), και ως εκ τούτου θα πρέπει να προσεγγιστεί χωριστά. Αυτό μπορεί να είναι ελαφρώς λιγότερο αποτελεσματική από ένα ενιαίο-threaded άποψη, αλλά κάθε φορά που θα συνδέσει κάτι μαζί, χάνετε την προσωρινή αποθήκευση της αποτελεσματικότητας και asychronosity (το κλειδί για την κλιμάκωση είναι asychronosity).
  • Ο όρος για να πάρει τα δεδομένα μπροστά από το χρόνο είναι προ-γοητευτικός. Προ-γοητευτικός μπορεί να συμβεί κατά τη στιγμή της πρόσβασης ή στο παρασκήνιο, αλλά πριν από αυτό που πραγματικά χρειάζεται η προαναζητηθεί δεδομένων. Ομοίως με προ-υπολογισμού. Είναι ένα trade-off του κόστους τώρα, το κόστος αποθήκευσης, και το κόστος για να πάρει όταν χρειάζεται.
  • «Ταξινόμηση cache» είναι ένα ικανό όνομα.
  • Δεν γνωρίζω.

Επίσης, όταν cache πράγματα, να τα αποθηκεύουν προσωρινά όσο το δυνατόν πιο γενικό επίπεδο. Μερικά πράγματα θα μπορούσαν να είναι συγκεκριμένο χρήστη (όπως αποτελέσματα για ένα ερώτημα αναζήτησης), όπου οι άλλοι μπορεί να είναι χρήστης αγνωστικιστής, όπως η περιήγηση ένας κατάλογος. Και οι δύο μπορούν να επωφεληθούν από την προσωρινή αποθήκευση. Το ερώτημα κατάλογος θα μπορούσε να είναι συχνές και να σώσει λίγο κάθε φορά, και το ερώτημα αναζήτησης μπορεί να είναι ακριβό, και κερδίστε μερικές φορές.

Απαντήθηκε 09/02/2011 στις 08:00
πηγή χρήστη

ψήφοι
0

Υπάρχουν τόσοι τρόποι για να γίνει αυτό, όπως στο δέρμα η παροιμιώδης γάτα. Έτσι, εδώ είναι ένα ζευγάρι μου.

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

Αυτό το δεύτερο πίνακα θα μπορούσε στη συνέχεια να ερωτηθούν σε κάθε άποψη και η διαλογή είναι τόσο απλή όσο η ρύθμιση του κατάλληλου σειρά ταξινόμησης.

Όπως απαιτείται ανασυστήσουν το δεύτερο πίνακα με τα αποτελέσματα από τον πρώτο πίνακα, διατηρώντας έτσι τα δεδομένα φρέσκο, αλλά ελαχιστοποίηση της χρήσης του ακριβού ερωτήματος.

Εναλλακτικά, αν θέλετε να αποφύγετε ακόμα και τη σύνδεση με το db τότε θα μπορούσε να αποθηκεύσει όλα τα δεδομένα σε μια σειρά php και να το αποθηκεύσετε χρησιμοποιώντας memcached. Αυτό θα ήταν πολύ γρήγορη και με την προϋπόθεση λίστες σας δεν ήταν πολύ μεγάλη θα πόρων αποτελεσματική. και μπορούν εύκολα να ταξινομηθούν.

DC

Απαντήθηκε 11/02/2011 στις 05:19
πηγή χρήστη

ψήφοι
0

Βασικές υποθέσεις:

  • Ειδικά οι εβδομαδιαίες
  • Μπορούμε να αναμένουμε το site για να αλλάξετε σπάνια ... ίσως καθημερινά;
  • Μπορούμε να ελέγξουμε ενημερώσεις της βάσης δεδομένων με αιθέρα API ή απαντήσει μέσω ενεργοποίησης

Εάν η ιστοσελίδα αλλάζει σε καθημερινή βάση, προτείνω ότι όλες οι σελίδες είναι στατικά δημιουργείται μια μέρα στην άλλη. Ένα ερώτημα για κάθε επαναλαμβάνει το είδος-παραγγελία μέσω και κάνει όλες τις σχετικές σελίδες. Ακόμη και αν υπάρχουν δυναμικά στοιχεία, οι πιθανότητες είναι ότι μπορείτε να τα αντιμετωπίσει με τη συμπερίληψη των στατικών στοιχείων της σελίδας. Αυτό θα παρέχει τη βέλτιστη εξυπηρέτηση σελίδα και χωρίς φορτίο βάσης δεδομένων. Στην πραγματικότητα, θα μπορούσε ενδεχομένως να δημιουργήσει ξεχωριστές σελίδες και προηγούμενο / επόμενο στοιχεία που περιλαμβάνονται στις σελίδες. Αυτό μπορεί να είναι πιο τρελός με 200 τρόπους για να ταξινομήσετε, αλλά με 3 Είμαι μεγάλος οπαδός του.

?sort=price
include(/sorts/$sort/tomatoes_class_1)
/*tomatoes_class_1 is probably a numeric id; sanitize your sort key... use numerics?*/

Αν για κάποιο λόγο αυτό δεν είναι εφικτό, θα ήθελα να καταφεύγουν σε αποστήθιση. Memcache είναι δημοφιλής για αυτό το είδος του πράγματος (λογοπαίγνιο!). Όταν κάτι ωθείται στη βάση δεδομένων, μπορείτε να εκδώσει έναυσμα για την ενημέρωση της προσωρινής μνήμης σας με τις σωστές τιμές. Κάνετε αυτό με τον ίδιο τρόπο που θα αν σαν να ενημερωθεί το στοιχείο σας υπήρχε σε 3 συνδεδεμένες λίστες - επανασύνδεση ανάλογα με την περίπτωση (this.next.prev = this.prev, κλπ). Από ότι, εφ 'όσον μνήμη cache σας δεν υπερπλήρωση, θα είναι το τράβηγμα απλό τιμές από τη μνήμη σε ένα πρωτεύον κλειδί της μόδας.

Αυτή η μέθοδος θα πάρει κάποια επιπλέον κωδικοποίηση για τις επιλέγουν και ενημέρωση / ένθετο μεθόδους, αλλά θα πρέπει να είναι αρκετά ελάχιστη. Στο τέλος, θα πρέπει να ψάχνει [id of tomatoes class 1].price.next. Αν αυτό το κλειδί είναι στη μνήμη cache, χρυσό. Αν όχι, εισάγετε στο κρυφής μνήμης και οθόνη.

  • Πιστεύετε ότι αυτή είναι μια καλή πρακτική για να βρείτε τις γειτονικές εγγραφές για την αλλαγή παραγγελίες ερώτημα; Ναί. Είναι σοφό να εκτελέσει ματιά-Aheads την αναμενόμενη επικείμενες αιτήσεις.
  • Ξέρετε καλύτερες πρακτικές όσον αφορά τις επιδόσεις και την απλότητα; Ξέρετε κάτι που κάνει αυτό το εντελώς ξεπερασμένο; Ας ελπίσουμε ότι η παραπάνω
  • Στη θεωρία προγραμματισμού, είναι ένα όνομα για αυτό το πρόβλημα; Βελτιστοποίηση?
  • Είναι το όνομα «Ταξινόμηση cache» είναι κατάλληλο και κατανοητό για αυτήν την τεχνική; Δεν είμαι βέβαιος για ένα συγκεκριμένο κατάλληλο όνομα. Είναι caching, είναι μια μνήμη cache του είδους, αλλά δεν είμαι σίγουρος ότι μου λέει έχετε μια «προσωρινή μνήμη διαλογής» θα μεταφέρει άμεσα την κατανόηση.
  • Υπάρχουν αναγνωρισμένα, κοινά πρότυπα για να λύσει αυτό το πρόβλημα; Πώς ονομάζονται? Προσωρινή αποθήκευση;

Δυστυχώς ουράς απαντήσεις μου είναι το είδος της άχρηστο, αλλά νομίζω ότι αφήγηση λύσεις μου θα πρέπει να είναι αρκετά χρήσιμο.

Απαντήθηκε 11/02/2011 στις 18:13
πηγή χρήστη

ψήφοι
0

Θα μπορούσε να σώσει τις αριθμούς σειράς των ταξινομημένες λίστες σε απόψεις , και θα μπορούσε να φθάσει τα προηγούμενα και τα επόμενα στοιχεία της λίστας κάτω (current_rownum + 1) αριθμοί σειράς (current_rownum-1) και.

Απαντήθηκε 12/02/2011 στις 14:01
πηγή χρήστη

ψήφοι
0

Το πρόβλημα / datastructur ονομάζεται αμφίδρομη γράφημα ή θα μπορούσατε να πείτε ότι έχετε πολλές συνδεδεμένες λίστες.

Αν σκεφτείτε το σαν μια συνδεδεμένη λίστα, μπορείτε να προσθέσετε λίγο πεδία στον πίνακα στοιχεία για κάθε διαλογή και προηγούμενο επόμενο πλήκτρο /. Αλλά η DB πρόσωπο θα σε σκοτώσω γι 'αυτό, είναι σαν να GOTO.

Αν σκεφτείτε το σαν ένα κατευθυνόμενο γράφημα (δι-), μπορείτε να πάτε με την απάντηση της Jessica. Το κύριο πρόβλημα είναι ότι οι ενημερώσεις ώστε είναι ακριβά λειτουργίες.

 Item Next Prev
   A   B     -
   B   C     A
   C   D     B
   ...

Εάν αλλάξετε ένα αντικείμενα θέση στη νέα τάξη Α, Γ, Β, D, θα πρέπει να ενημερώσετε 4 σειρές.

Απαντήθηκε 13/02/2011 στις 02:20
πηγή χρήστη

ψήφοι
4

Έχω μια ιδέα κάπως παρόμοια με Τζέσικα. Ωστόσο, αντί για την αποθήκευση συνδέσμους για τα επόμενα και προηγούμενα στοιχεία του είδους, μπορείτε να αποθηκεύσετε τη σειρά ταξινόμησης για κάθε τύπο ταξινόμησης. Για να βρείτε την προηγούμενη ή την επόμενη εγγραφή, απλά να πάρει τη σειρά με SortX = currentSort ++ ή SortX = currentSort--.

Παράδειγμα:

Type     Class Price Sort1  Sort2 Sort3
Lettuce  2     0.89  0      4     0
Tomatoes 1     1.50  1      0     4
Apples   1     1.10  2      2     2
Apples   2     0.95  3      3     1
Pears    1     1.25  4      1     3

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

δηλαδή

once_per_day
  add/delete/update all records
  recalculate sort orders

Η ελπίδα αυτό είναι χρήσιμο.

Απαντήθηκε 13/02/2011 στις 03:30
πηγή χρήστη

ψήφοι
0

Συγνώμη αν έχω παρεξηγηθεί, αλλά νομίζω ότι θέλετε να διατηρήσετε την ταξινομημένη λίστα των χρηστών έχει πρόσβαση στο διακομιστή. Αν ναι, η απάντησή σας μπορεί να βρίσκεται σε στρατηγική caching και τεχνολογίες σας και όχι στη βάση δεδομένων βελτιστοποίηση ερωτήσεων / σχήματος.

Η προσέγγισή μου θα ήταν να serialize () της συστοιχίας μία φορά πρώτη ανακτηθεί του, και στη συνέχεια cache ότι σε μια ξεχωριστή περιοχή αποθήκευσης? αν αυτό είναι memcached / APC / σκληρό δίσκο / MongoDB / κλπ και να διατηρήσει τα στοιχεία θέσης μνήμης cache για κάθε χρήστη ξεχωριστά μέσω των δεδομένων της συνεδρίας τους. Η πραγματική backend αποθήκευσης θα ήταν φυσικά εξαρτάται από το μέγεθος του πίνακα, που δεν πηγαίνουν σε πολύ λεπτομέρεια για, αλλά memcached κλίμακες μεγάλη σε πολλαπλές servers και Mongo ακόμη περισσότερο σε μια ελαφρώς μεγαλύτερη λανθάνουσα κόστος.

Μπορείτε, επίσης, δεν δείχνουν πόσοι είδους παραλλαγές υπάρχουν στον πραγματικό κόσμο? π.χ. μήπως πρέπει να cache ξεχωριστές λίστες ανά χρήστη, ή μπορεί να σας συνολικά μνήμη cache ανά είδος μετάθεσης και στη συνέχεια να φιλτράρει ό, τι δεν χρειάζεστε μέσω PHP ?. Στο παράδειγμα που δίνετε, θα ήθελα απλά cache και τις δύο παραλλαγές και κατάστημα το οποίο από τις δύο έπρεπε να unserialize () στα δεδομένα συνεδρίας.

Όταν ο χρήστης επιστρέφει στο χώρο, ελέγξτε το Time To Live αξία των προσωρινά αποθηκευμένων δεδομένων και την εκ νέου χρήση, αν εξακολουθεί να ισχύει. Θα ήθελα, επίσης, να έχει σκανδάλη τρέχει σε INSERT αγνόησης / ΕΝΗΜΕΡΩΣΗ / ΔΙΑΓΡΑΦΗ για τις ειδικές προσφορές που θέτει απλά ένα πεδίο σήμανσης χρόνου σε ένα ξεχωριστό πίνακα. Αυτό θα δείξει αμέσως αν η μνήμη cache ήταν μπαγιάτικο και το ερώτημα που χρειάζεται να επαναληφθεί για πολύ χαμηλό κόστος ερώτημα. Το μεγάλο πράγμα για χρησιμοποιώντας μόνο τη σκανδάλη για να ορίσετε ένα ενιαίο πεδίο είναι ότι δεν υπάρχει λόγος να ανησυχείτε για το κλάδεμα παλιά / περιττές τιμές από του εν λόγω πίνακα.

Είτε αυτό είναι κατάλληλο, θα εξαρτηθεί από το μέγεθος των δεδομένων που επιστρέφονται, πόσο συχνά είχε τροποποιηθεί, και τι caching τεχνολογίες είναι διαθέσιμες στο διακομιστή σας.

Απαντήθηκε 13/02/2011 στις 15:47
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more