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.
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 :)