Slike u bazi

tehnologijebaze podataka

Jučer sam s kolegom izmijenio nekoliko kratkih blic poruka u svezi njegovog problema sa skeniranjem i arhiviranjem dokumenata. Zapravo on je započeo raspravu s pitanjem da li imam iskustva sa spremanjem slika u bazu. Imam iskustva, ali moje mišljenje glede te teme je kristalno jasno. Ne preporučujem spremanje slika u bazu, osim u slučajevima kada je to stvarno opravdano, ali takvi slučajevi su rijetki. Obično je dovoljno da se slika spremi negdje na obični datotečni sustav, a u tablici se samo zapiše njezina pozicija. Netko će odmah graknuti kako je u tom slučaju backup otežan jer se mora pospremati hrpa toga umjesto da se jednostavno pospremi samo baza. To je istina. Spremanje slika u bazu (uobičajeno je da se za to koristi BLOB) ima još nekoliko prednosti:


  • ne morate brinuti o specifičnostima datotečnog sustava (kosa crta na ovu ili onu stranu, ime diska, direktorija, mala-velika slova)

  • ne morate dodatno brinuti o zaštiti slika i pravima pristupa

  • sinkronizacija slika i podataka koji su u relaciji je jednostavna, obrišete djelatnika, obrisali ste i njegove slike i pripadajuće dokumente (jasno ukoliko ste dobro definirali relacije)

Datotečni sustav opet ima svoje prednosti:


  • lakše je koristiti slike s datotečnog sustava, radite li na web aplikaciji onda je dovoljno navesti samo lokaciju slike, a preglednik i web server će se pobrinuti za ostalo, lakše je korištenje slika iz različitih aplikacija ili protokola

  • ukoliko promijenite bazu za vas se ništa ne mijenja, kod slika u bazi očekujte glavobolju, promjenu koda zbog različitog rukovanja BLOB-ovima

  • slike u bazi povećavaju njezinu veličinu, a neke baze imaju ograničenja na veličinu zbog tehnoloških ili marketinških ograničenja

  • veličina slikovnog materijala ograničena je jedino slobodnim mjestom na vašim diskovima

  • moguć je pregled slika iz drugih programa, moguća je obrada slika bez opterećivanja baze

  • velika količina BLOB-ova u bazi ima utjecaj na performanse, ali i na integritet baze

Slike (ili bilo koje druge datoteke) su zapravo poseban objekt, poseban skup informacija i kao takve logički ne pripadaju u bazu u kojoj se čuvaju druge vrste informacija.



Komentari

7. travnja 2006. 08:56

Mogu ja malo? :)

Upravo kada se radi o pohranjivanju slika u bazu, moras brinuti o dosta stvari, bas moras brinuti o pravima pristupa i zastiti, posto se obicno radi o unixoidnim sistemima, lakse je postaviti odredjene dozvole na sliku na datotecnom sustavu nego razvijati jos jedan layer prava pristupa podacima u bazi. U drugu ruku, postoje mehanizmi kojima se odredjuje pristup podacima u bazi podataka - no smatram da je "chmod" puno puno laksi :) IMHO.

Sinhronizacija, argument ne stoji, kako je lako obrisati sliku iz baze, tako je isto lako obrisati sliku sa datotecnog sustava, par jednostavnih wrapera u bilo kojem programskom jeziku ce totalno dobro odraditi posao - that is, ako se dobro iskodira.

Odavno sam napustio BLOB-anje, koristim ga za objekte manje od 50 KB, a i onda sam skeptican upravo prema brzini aplikacije. Ima to svojih prednosti no u rijetkim slucajevima.

Datotecni sustav je sjajno mjesto za pohranjivanje slika i inih datoteka, to su datoteke i mjesto im je na datotecnom sustavu u obliku datoteka. Ustedis toliko procesorske snage samim time sto niti (php) programski jezik ne trosi vrijeme na trazenje slike, niti je troughput baze opterecen filanjem tamo nekih slika...

Zadnja recenica ti je sjajna, dakle - slike NE u bazu :)

Ako se radi o brzini, developer moze ici jos dalje i totalno izostaviti Apache iz te price (child procesi i finte, uzasan performans na tom polju) te koristiti nekih non-throttling I/O based server poput "thttpd"-a koji ce nadmasiti vecinu servera pri sluzenju datoteka korisnicima. Dakle, ostavimo statican sadrzaj onome tko ga moze i zna efikasno sluziti.

Mislim da developer neke iole ozbiljnije web aplikacije ne bi smio niti pomisljati na koristenje baze za pohranu datoteka, cemu to? Ne mozes ih indexirati, FULLTEXT pretrazivati, nista ... one su tamo i jos zahtijevaju obicno jedno polje koje opisuje sadrzaj / naziv doticne.

Nadam se da je ovo dosta argumenata da ljudi jednostavno zaborave nate perverzije :)

Inace, zanimljiv post u svakom slucaju :)

7. travnja 2006. 10:29

U bazi se pretpostavlja da nećeš razvijati posebna prava pristupa već ćeš koristiti postojeća (ako netko može mijenjati slog djelatnika ista prava ima i nad njegovom slikom).

Ja sam i na početku i na kraju naznačio da sam protiv te prakse.

Interesantno je da se većina manje iskusnih developera, kad se suoči s problemom povezivanja slika s nekim podatkom u bazi, odmah odluči na trpanje slika u bazu, a rješenje sa spremanjem puta do slike na datotečnom sustavu im u pravilu na pada na pamet.

7. travnja 2006. 11:12

Ma stoji to sve, samo potenciram komplikacije koje obicno proizlaze jer se developeri zakopaju u ta prava pristupa u bazi, sve to zavrsi vrlo lose uglavnom - overhead.

Slazemo se da to nije pametno, to je bitno! :) Upravo ja koristim tu praksu da pohranim samo ime datoteke u bazu, cak niti putanju ne pohranjujem jer opet postoji mogucnost da cu mijenjati lokaciju direktorija gdje pohranjujem slike te put to direktorija navedem u nekom konfiguracijskom fajlu i onda sam miran u svakom slucaju :) A u isto vrijeme izbjegnem kojekakve hijerarhijske manipulacije ../../../ i sta ti ja znam :) Tesko, ali opet moguce :)(

7. travnja 2006. 11:13

Hm, WP odbija primit komentar koji u sebi sadrzi etc/passwd :)

Not Acceptable An appropriate representation of the requested resource /wp-comments-post.php could not be found on this server.

22. studenoga 2007. 21:20

ja sam pocetnik u php msql mozete li mi objasniti kako se radi sa slikama u php i mysql , radi jedan auto oglasnik na adresi - na upit .Unaprijed hvala!

imate li neki korisni link za ucenje ili neki primjer skriptu da je prostudiram malo.Thanks drazXen

22. studenoga 2007. 21:31

Dakle ovdje smo zaključili da slike nećemo spremati u bazu već na file system. U bazu se samo sprema path, a kako spremiti string u bazu to vam je, pretpostavljam, jasno.

Za rad sa slikama u PHP-u koristi se GD library. Ako nije instaliran ili aktiviran treba to napraviti.

Raznih tutoriala i skripti ima širom neta (tražite php i gd). Par primjera:

12. prosinca 2010. 18:39

Malo kasnim al eto:) Deco odjebite sve ove spike, trpajte slike u bazu (jedino za web aplikacije razmislite). Slike utjecu na integritet baze? :) Ne mozes komprimirane slike pretrazivati sa fulltext? Sta ces nac? :) Posebna prava pristupa? Tesko dodat tablicu work useru? :)

Trpajte slike u bazu, bit ce vam zivot jednostavniji, slusajte nekoga tko s tim radi 8 sati dnevno, a ne ove wannabe perfect solution, nema toga. Niste ovisni o OS-u, nemate jebade sa pravima, lagan backup. Svaka prava baza ce znati raditi sa blobovima, stavit ih na drugi disk il na kraj, nikakav utjecaj na performanse. Ako drzite slike na disku, pa onda ih stalno sinkate ako imate vise web servera? :) Jel to jednostavnije? Znaci - slike u bazu!! Mi imamo bazu slika od 700 GB pa nema usporavanja..