U poslednje vreme JSON tip podataka postaje aktuelan, u MySQL 8 se najavljuju brojna poboljšanja ali i dalje imam nedoumice koliko se gubi na performansama ako bi se koristilo.
Evo recimo da pogledamo sledeći primer. Ako želimo da snimamo neka dokumenta u bazu, standardno bi koristili dve tabele. U jednoj bi bila sama dokumenta a u drugoj stavke. Kad se dokument snima, u transakciji se upiše sam dokument i zatim slede inserti za tabelu stavki. Ako bi koristili PHP i prepared statements, tu bi imali gomilu transakcija ka bazi, praktično onoliko koliko ima stavki + dokument.
Sa druge strane, ako bi stavke spakovao u JSON, onda bi imao jednu tabelu i jedan upis u bazu. Znači, bila bi tabela dokumenata gde bi jedna kolona bila "stavke" i tu bi bio JSON sa stavkama. Brzina upisa bi definitivno bila bolja jer bi bila jedna transakcija ka bazi i upis u jednu tabelu. Naime, JSON sa stavkama već imam od strane client forme koji se, posle validacije, samo prosledi bazi. U tom kontekstu mi se čini da bi brzina upisa (pa čak i izmena) dokumenata bila značajno poboljšana nego u prethodnom "old fashioned" načinu sa dve tabele.
E sad dolazi ono što me brine. Koliki je gubitak na performansama kad bi se radile "vertikalne" analize nad tako unetim JSON stavkama? Na primer, svaka stavka ima id artikla, količinu, cenu, koješta... i sad hoću da dobijem spisak najprodavanijih artikala sa njihovim vrednostima. U slučaju one prve varijante, imao bih tabelu koja se lako filtrira dok u ovom drugom slučaju MySQL mora da prolazi kroz JSON podatke što je, pretpostavljam, procesorski zahtevnije. Naravno, oni kažu kako ti JSON podaci ne stoje baš u text obliku kako ih mi ljudi vidimo već da se to pretvara u binary format koji je optimizovan za operacije nad podacima ali se opet postavlja pitanje, da li je to isto ili lošije, i koliko, u odnosu na pravu tabelu.
Na netu nema nešto mnogo testova koji razjašnjavaju ovu dilemu, pogotovo za MySQL 8 pa me zanima šta mislite? Koliko se sa JSON formatom dobija na praktičnoj strani time što bi bilo manje tabela i jednostavniji upis u bazu, a koliko se gubi kod kasnijeg izveštavanja i filtriranja podataka?
Evo recimo da pogledamo sledeći primer. Ako želimo da snimamo neka dokumenta u bazu, standardno bi koristili dve tabele. U jednoj bi bila sama dokumenta a u drugoj stavke. Kad se dokument snima, u transakciji se upiše sam dokument i zatim slede inserti za tabelu stavki. Ako bi koristili PHP i prepared statements, tu bi imali gomilu transakcija ka bazi, praktično onoliko koliko ima stavki + dokument.
Sa druge strane, ako bi stavke spakovao u JSON, onda bi imao jednu tabelu i jedan upis u bazu. Znači, bila bi tabela dokumenata gde bi jedna kolona bila "stavke" i tu bi bio JSON sa stavkama. Brzina upisa bi definitivno bila bolja jer bi bila jedna transakcija ka bazi i upis u jednu tabelu. Naime, JSON sa stavkama već imam od strane client forme koji se, posle validacije, samo prosledi bazi. U tom kontekstu mi se čini da bi brzina upisa (pa čak i izmena) dokumenata bila značajno poboljšana nego u prethodnom "old fashioned" načinu sa dve tabele.
E sad dolazi ono što me brine. Koliki je gubitak na performansama kad bi se radile "vertikalne" analize nad tako unetim JSON stavkama? Na primer, svaka stavka ima id artikla, količinu, cenu, koješta... i sad hoću da dobijem spisak najprodavanijih artikala sa njihovim vrednostima. U slučaju one prve varijante, imao bih tabelu koja se lako filtrira dok u ovom drugom slučaju MySQL mora da prolazi kroz JSON podatke što je, pretpostavljam, procesorski zahtevnije. Naravno, oni kažu kako ti JSON podaci ne stoje baš u text obliku kako ih mi ljudi vidimo već da se to pretvara u binary format koji je optimizovan za operacije nad podacima ali se opet postavlja pitanje, da li je to isto ili lošije, i koliko, u odnosu na pravu tabelu.
Na netu nema nešto mnogo testova koji razjašnjavaju ovu dilemu, pogotovo za MySQL 8 pa me zanima šta mislite? Koliko se sa JSON formatom dobija na praktičnoj strani time što bi bilo manje tabela i jednostavniji upis u bazu, a koliko se gubi kod kasnijeg izveštavanja i filtriranja podataka?