Caut cel mai bun mod de a prelua înregistrările următoare și anterioare ale unei înregistrări fără a executa o interogare completă. Am o soluție complet pusă în aplicare în loc, și ar dori să știe dacă există abordări mai bine pentru a face acest lucru acolo.
Să presupunem că suntem construirea unui site web pentru o zarzavagiu fictive. În plus față de paginile sale HTML, în fiecare săptămână, el vrea să publice o listă de oferte speciale pe site-ul său. El vrea aceste oferte de a locui într-un tabel de baze de date reale, iar utilizatorii trebuie să fie în măsură să sorteze ofertele în trei moduri.
Fiecare element are , de asemenea , să aibă o pagină de detaliu cu mai multe informații, textuale privind oferta și butoanele „ pentru următoarele“ „anterioare“ și. Accesând „anterioară“ și butoanele „next“ trebuie să indice intrările învecinate în funcție de sortare utilizatorul a ales pentru lista .
alt text http://www.pekkagaiser.com/stuff/Sort.gif?
Evident, butonul „Next“ pentru „Tomate, clasa I“ trebuie să fie „Mere, clasa 1“ în primul exemplu, „perele, clasa I“, în al doilea, și nici unul în al treilea.
Sarcina în vederea în detaliu este de a determina elementele următoare și anterioare , fără a efectua o interogare de fiecare dată , cu ordinea de sortare a listei ca singurele informații disponibile (Să presupunem că obținem că printr - un parametru GET ?sort=offeroftheweek_priceși va ignora implicațiile de securitate) .
Evident, pur și simplu, care trece ID-urile elementelor următoare și anterioare ca parametru este prima soluție care vine în minte. La urma urmei, știm deja de identitate de la acest punct. Dar, acest lucru nu este o opțiune aici - ar lucra în acest exemplu simplificat, dar nu și în multe dintre mele cazuri de utilizare din lumea reală.
Abordarea mea actuală în CMS meu este folosind ceva ce am numit „sortare cache“. Când o listă este încărcată, am păstra pozițiile de elemente în înregistrări într - un tabel cu numele 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
Evident, itemscoloana este foarte populat cu ID - uri numerice.
În pagina de detalii, am acum acces corespunzătoare sortingcacheînregistrare, adu itemscoloana, exploda, caută ID - ul elementului curent, și să se întoarcă vecinul anterior și următor.
array(current => Tomatoes,
next => Pears,
previous => null
);
Acest lucru este , evident , scump, lucrează pentru un număr limitat de înregistrări și creează date redundante, dar să presupunem că în lumea reală, interogarea pentru a crea liste este foarte scump (este), care rulează - l în fiecare vizualizare detaliu este în afara întrebarea, iar unele este nevoie de cache.
Intrebarile mele:
Crezi că aceasta este o bună practică pentru a afla înregistrările vecine, pentru diverse ordine de interogare?
Știi practici mai bune în ceea ce privește performanța și simplitatea? Știi ceva ce o face acest lucru complet depășite?
În teorie de programare, există un nume pentru această problemă?
Este numele de „cache de sortare“ este adecvat și ușor de înțeles pentru această tehnică?
Există recunoscute, modele comune pentru a rezolva această problemă? Cum se numesc ei?
Notă: Întrebarea mea nu este vorba despre construirea listă, sau cum pentru a afișa vizualizarea în detaliu. Acestea sunt doar exemple. Întrebarea mea este funcționalitatea de bază de a determina vecinii unei înregistrări atunci când o re-interogare este imposibilă, iar cel mai rapid și mai ieftin mod de a ajunge acolo.
Dacă ceva este neclar, vă rugăm să lăsați un comentariu și voi clarifica.
Pornind de o recompensă - poate că există unele mai multe informații despre acest lucru acolo.














