Topic: Skirtingas rikiavimas

Tarkim turim struktūrą

ITEMS
id | title .....

ir
PROPERTIES
id | item_id | value (varchar) | group ....

value reikšmės gali būti tiek tekstas, tiek paprastas, tiek slankus skaičius etc (group apibūdina koks tipas).  Savaime suprantama jie visi yra rikiuojami skirtingai.

Ar yra koks būdas pakeisti rikiavimą on the fly, priklausimai nuo grupės (imama tik viena grupė). Kuriant skirtingus indexus ar dar kaip?

Ar geriau nesismulkinti ir tiesio kiekvienos reikšmės pradžioje pridėti tarpų ir tada jau rikiuoti kaip paprastą eilutę?


Ir kitas klausimas,

Ar yra galimybė rikiuoti pagal duotą masyvą. Kartais teks naudoti kelias užklausas, ir rikiuoti pagal kitos užklausos eilę. įsivaizduoju ką nors panašaus į ... ORDER BY `group`, `id` SUBBY (9,20,3,99) etc. ar teks viską per JOIN'us daryti?

Thanks :)

Re: Skirtingas rikiavimas

a) yra galimybė on-the-fly konvertuoti stulpelio tipą į kokį nori, bet šitas reikalas yra lėtas (CAST(), CONVERT()
b) yra galimybė turėti ne vieną reikšmių (value) stulpelį VARCHAR tipo, o kelis, tarkim value_int  (INT), value_char (CHAR), value_float (FLOAT), value_date (DATE), atitinkamo tipo reikšmes rašyti/skaityti iš atitinkamų stulpelų; čia nukenčia vieta, nes ji panaudojama neefektyviai;
c) yra galimybe sukurti atskiras lentas atskiro tipo laukams saugoti ir jas parinkinėti pagal tuo metu naudojamą tipą (šitas tikriausiai geriausias variantas);

Aišku reikia pabandyti pamodeliuoti/paskaičiuoti:
a) kiek yra/bus skirtingu naudojamų tipų;
b) kiek kiekvieno tipo yra/bus duomenų;

Jeigu skaičiai yra maži, ir serverio resursai leidžia efektyviai dirbti, tada a) variantas yra viliojantis :)

Re: Skirtingas rikiavimas

Visa idėjos esmė yra padaryti sistemą kiek įmanoma universalesnę ir atsikratyti tokių priedų, kaip value_float, value_date etc (išimtis *text tipui, kuris turi atskirą vietą).

įrašų vidutiniškai pradžiai ~50-100k turėtų laikyti.

Bet man kažkaip labiausiai pradėjo lipti idėja dėti tarpus ar '*' pradžioje eilutės. Tada viskas labai gražiai rikiuojasi, saugant vistiek darau callbacka sutvarkyti duomenims, o išvedant pakaks trim'o

****1
***10.5
**101
****0.999
Labas
Kitas
*[data]
*[kita data]
etc.

šiek tiek reikės papildomos vietos, bet gal išgyvens serveris :) Tik kai reikės daryti paiešką gali kilti keblumų, bet iki to kol kas dar toloka

Re: Skirtingas rikiavimas

Bet supranti, kad tu kas kartą dinamiškai apdoroji duomenis (konversija).

Todėl aš ir rašiau, kad reikia pasvarstyti - kas tau brangiau kainuoja - vieta (HDD/RAM) ar skaičiavimo resursai (CPU/RAM). Aš paskutiniu metu linkstu prie to, kad geriau tegul duomenys užima daugiau vietos, bet jie pateikiami/gaunami greičiau. Bet čia aišku tik mano nuomonė.

Re: Skirtingas rikiavimas

Ką turi omenyje sakydamas Bet supranti, kad tu kas kartą dinamiškai apdoroji duomenis (konversija). ?

Rašymo/skaitymo santykis yra 1:daug, tad saugojimas ne tokia jau ir didelė problema (kartą įrašai ir rami galva iki kito atnaujinimo, kas gali būti tik už kelių mėnesių)

O skaitant, tai kiek žinau trim() nelabai resursus ryja.

Re: Skirtingas rikiavimas

Jeigu žiūrėtum giliau tai:
a) skaitymo metu tu skaitysi VARCHAR(XXX), kuris yra tikrai lėtesnis negu tarkim skaityti MEDIUMINT tipo lauką;
b) jeigu darysi CAST() ar CONVERT() tai yra lėčiau negu to iš vis nedaryti;
c) jeigu daryti trim() tai yra lėčiau negu to nedaryti;
d) !!! kas bus kai reikės atlikti kokias nors paieškos/filtravimo/rūšiavimo operacijas su MySQL'u? (-; bus lėčiau ir sudėtingiau;

Ir visą tai atliekama kas kartą skaitant

Aišku, jeigu visa sistema yra gana statiška ir nelinkusi keistis/vystytis, kai pridedamos naujos funkcijos, naujos ataskaitos, tai gal ir galima gyventi;

MySQL serveris tikrai efektyviau laikys ir skaitys duomenis pagal tipus iš skirtingų stulpelių, negu tu tai atliksi dinamiškai su SQL/PHP pagalba.

Pabandyk kaip skiriasi:
a) skaityti 100k INT tipo duomenų iš VALUE_INT lauko;
b) skaityti 100k VARCHAR tipo duomenų iš VALUE lauko su "*" ir viską konvertuotis į INT'us;

Taip pat pabandyk susotinti abiem atvejais (-;

šita problema ir pas mane buvo/yra, todėl prie jos kažkiek esu sėdėjęs; Dirbant su MySQL esu linkęs naudoti MySQL tipus ir laikyti, kad MySQL'as duomenų saugojimo/apdorojimo operacijas atliks efektyviai. Kol kas neteko dirbti su didelėm sistemom, kurios naudojo tik vieno tipo lentas (raktas-duomenys/key-valye), kaip tai daro kai kurie super-duper portalai siekdami greičio, bet ten veikia ir visai kito tipo duomenų valdymo sistemos specialiai į tai orientuotos ir tam optimizuotos.

Re: Skirtingas rikiavimas

Kažkas panašaus: http://couchdb.apache.org/