Interogare produse din categorii multinivel cu ordonare

Am pornit la drum cu o idee simpla de organizare a unor produse (dintr-un magazin online sa zicem) dar care s-a naruit cand am adaugat un camp de “ordine” :slight_smile:

Am structura asta (destul de clasica)
categorii: id,id_parinte,titlu
produse: id,titlu
categorii_produs: id,id_categorie,id_produs,ordine

practic exista o lista de nested categories cu level-uri nelimitate si produsele care sunt puse in oricare din aceste categorii cu o anumita prioritate (ordine)

  • fashion
    • incaltaminte
      • sandale
        • sandale sport
        • sandale de mireasa
      • pantofi de munte
        • de vara
        • de iarna
      • pantofi

produs1 e pus in “sandale sport” cu ordinea 1, in “sandale de mireasa” cu ordinea 2

asteptarile oamenilor care ajung intr-o categorie care are subcategorii e sa vada automat toate produsele din toate subcategoriile (lucru pe care l-am si facut in functie de ordinea pusa in subcategorii)

problema e ca facand asta nu am control direct a ce se intampla in categoria mare “sandale”, pentru ca acolo doar sunt luate la gramada produse din subcategorii.

structura bazei de date imi permite sa adaug “produs1” direct in “sandale” si sa-i pun ce ordine vreau dar nu inteleg cum as putea sa scot dintr-o singura interogare toate produsele (distincte) din categoria mare si toate subcategoriile sale dar ordinea prioritara sa fie cea de la categoria mare (daca exista adaugat si acolo)

as putea sa fac 2 interogari (una pt categoria mare si una pentru toate subcategoriile) si sa le fac merge inainte de a le afisa dar imi pare ca se complica treaba avand si paginare si produse care vor aparea si in prima si in a 2-a interogare)

Am avut o experiență asemănătoare lucrând la o platformă de știri.

structura bazei de date imi permite sa adaug “produs1” direct in “sandale” si sa-i pun ce ordine vreau dar nu inteleg cum as putea sa scot dintr-o singura interogare toate produsele (distincte) din categoria mare si toate subcategoriile sale dar ordinea prioritara sa fie cea de la categoria mare (daca exista adaugat si acolo)

Te poți juca cu intervalul în care salvezi prioritatea în funcție de nivelul pentru care o salvezi. Gen nivelul unul are prioritățile salvate × 1000, nivelul doi × 100, nivelul 3 × 10 și apoi folosești agregare pe valoarea respectivă (min/max). Dacă salvezi deja nivelul (numărul de părinți în categorie, poți face înmulțirea direct în query probabil)


Sincer, în locul tău aș evita să implementez așa ceva și aș încerca să simplific.

Una din problemele comune e când adaugi conținut nou (în cazul tău produse). Unde o să apară? Trebuie să meargă editorul să le adauge în topul categoriei că altfel se duc pe ultima pagină? Sau se adaugă la început și atunci orice produs împins în față de editor (promovat) o să treacă pe poziția doi?

Dacă implementezi drag-and-drop pentru sortare o să trebuiască paginare. Drag-and-drop între pagini… E posibil, dar codul ăla o să fie destul de complex.

Alternative:

  • Opțiuni să promovezi produse care să apară automat în topul listei și sortezi doar produsele respective
    O să fie mai puțin produse de editat/sortat când se schimbă ceva. Poți face un panou de administrare simplificat doar pentru asta. Plus că e mai ușor de adăugat timp de expirare a sortării customizate (gen ții un produs ca promo doar 5 zile)
  • Faci o sortare globală a produselor indiferent de categorie
    Atunci ordinea devine proprietate a produsului și nu mai contează categoria. O să te lovești de problema cu sortarea drag-and-drop cu paginare. Greu de implementat sortare temporară/expirare și greoi de folosit de către administratorii magazinului.
  • Folosești o altă sortare by default
    De exemplu cele mai populare (după cumpărături, vizualizări, click-uri etc) și oferi opțiuni utilizatorului de a schimba ordinea (gen cele mai noi, preț etc). Dacă e nevoie, poți să oferi posibilitatea de a suprascrie manual scorul pentru popularitate pentru a promova anumite produse sau poți implementa bannere pentru a promova anumite produse.

Ca utilizator al magazinului cred că o navigare mai ușoară se obține cu un motor de căutare mai bun (sortare după relevanță), și filtre cât mai mult și cât mai ușor de folosit. Ce vrea magazinul să vândă e puțin relevant în majoritatea cazurilor.


Baftă! Și sper să ne spui cum ai rezolvat până la urmă :slight_smile:

am hotarat sa aleg varianta pentru care nu mai trebuie sa lucrez in plus :slight_smile: adica sa asociez produsul inclusiv categoriei mari si sa-i dau o ordine specifica (cifre cu mii) acestei asocieri.

celelalte sugestii nu s-au mulat pe cerinta exacta de control pentru fiecare categorie in parte (indiferent de nivelul ei), fara a lasa nimic la voia hazardului/algoritmilor de sortare :slight_smile:

multumesc pentru raspunsul complet si exemplificativ

1 Like

Este un tip de structura de date care cred ca se potriveste cu cerintele tale

2 Likes