Co się dzieje, gdy dane są nie tylko w bazie?

Z tym problemem często spotykam się w pracy.

Standardowe zagadnienie – klient chce wrzucać obrazki na stronę, a my ze względu na bazę zapisujemy je jako pliki, a w bazie co najwyżej ścieżkę do niego.
No i niestety przeniesienie systemu na inny serwer (np. produkcyjny) to, oprócz kopiowania kodu i bazy, przenoszenie multimediów, które nie zawsze jest miłe i przyjemne.

Dlatego od jakiegoś czasu chodzi mi po głowie pewna koncepcja, która ten problem mogłaby rozwiązać.
Otóż pliki binarne, podczas uploadu należało by jednak zapisać w bazie. Do tego należałoby opracować komponent, który w przypadku żądania obrazka o id = 1 sprawdziłby odpowiedni katalog i po znalezieniu go – zwrócił jako odpowiedź. Z kolei przy jego braku w systemie plików – utworzył takowy na podstawie danych w bazie i w standardowy sposób zwrócił plik jako odpowiedź.

Świetnie by się do tego nadawały cake’owe behaviors. Do tego można by go sprząc z jeszcze jedną funkcjonalnością- plik mógłby być w bazie zapisywany (w razie podmiany zawartości) za każdym razem pod inną nazwą (np. id_kolejny_numer_wersji). Dzięki temu możnaby tym plikom ustawić nagłówki Expire z odległą przyszłością i korzystać z dobrodziejstw bufora przeglądarek…

Share Button

4 thoughts on “Co się dzieje, gdy dane są nie tylko w bazie?

  1. A chciałby Pan jes zapisywać w bazie jako BLOB czy jakoś inaczej?

  2. Mysql nie pozostawia zbyt wielkiego wyboru, zatem tak – BLOB, lub jakaś jego dłuższa wersja w razie gdyby 64 kilo okazało się zbyt krótkie ;)
    Kiedyś na KGD.NET była świetna prelekcja o MSSQL (2007, albo 8), niestety nie pamiętam czyja. Usłyszałem tam o ciekawym rozwiązaniu – silnik bazy może zapisywać BLOBy jako pliki. Z tym, że odbywa się to niejawnie. Plusy tego są takie, że dostęp jest szybki jak w przypadku zapisywania BLOBów w plikach, ale nie zajmujemy się tym osobiście. Robi to za nas DBMS. Dlatego robiąc eksport nie ma obawy, że coś zgubimy. Ciekawe czy w mySQL można czegoś takiego oczekiwać?

  3. Hi,
    rozwiazanie bardzo ciekawe, ma jednak pewna wade : kilka tysiecy plikow w duzych rozdzielczosciach zapisanych do bazy i dump albo restore bazy trwa i trwa i zarzyna serwer (to tylko domniemanie).

    Powiedzmy 1000 plikow po 5mb kazdy i mamy 5GB danych to zrzucenia / odtworzenia extra.

    U mnie serwerze. pelny dump jest robiony co godzine – wiec troche by to zamulalo. Nie wiem czy mysql wspiera backup roznicowy – to moglo by znacznie podniesc wydajnosc takiego rozwiazania.

    Byc moze przechowywanie w bazie duzych wagowo obrazkow to niekoniecznie najszczesliwszy pomysl, ale idea samego behaviora jak nabardzie ok, w czego razie moge pomoc.

  4. Cześć Robal, czy jesteś tym robalem(77) z polskiego forum cake?

    Zgadza się – wielkie bazy są problemem. Spotkaliśmy się z tym ostatnio przy przenoszeniu portalu na home.pl. Tam należało ograniczyć rozmiar pliku do mniej niż 5MB, gdyż max_allowed_packet_size był ustawiony właśnie na 5MB. Ale to była dość drobna niedogodność.

    Czasem jednak nie ma rozwiązań idealnych. Jednak jeśli masz serwer dedykowany, to możesz dumpy wykonywac z pominięciem tej wielkiej tabeli (może nawet pola), a pełny zrzut robić raz na dobę?

    Dziękuję za gotowość pomocy, jednak w międzyczasie się za to wziąłem. Możesz przykład znaleźć pod http://bakery.cakephp.org/articles/view/imagebehavior-best-from-database-blobs-and-file-storage . Szczególnie polecam komentarze poniżej z usprawnieniami i kilkoma dobrymi pomysłami (np. przeniesienie samego bloba do osobnej tabeli).

    Pozdrawiam

Leave a Reply

Your email address will not be published. Required fields are marked *