Pliki w formie binarnej w bazie

Wcześniej pisałem o tym problemie, gdy pliki trzymamy fizycznie na dysku a w bazie tylko informację np. nazwę pliku (Co się dzieje, gdy dane są nie tylko w bazie).

Jako, że nowe projekty także służą do eksperymentowania z nowymi rozwiązaniami, dlatego próbujemyz nowymi rozwiązaniami:

  1. Po pierwsze komponent: ma dostawać tablicę po uploadzie (chodzi o pola “file”), zwracać nazwę zapisanego pliku (dla standardowego podejścia) lub zawartość gotową do wrzucenia do BLOBa
  2. Po drugie Helper, który będzie się zajmował wyświetlaniem takich zdjęć (a w przyszłości także zajmie się cache’owaniem ze wspomnianą w powyższym artykule metodą z nagłówkami expire)

W takim rozwiązaniu niestety pojawia się problem (strzałki oznaczają przepływ danych, uwaga: diagram nie przedstawia dosłownie przebiegu jednego zapytania, ale dwóch zapisu (do kontrolera) i wyświetlenia obrazka (od kontrolera)) :

Chodzi o fragment zaznaczony na czerwono. To jest nadmiarowe zachowanie. Lepiej byłoby, gdyby komponent (poprzez kontroler) przekazał nazwę pliku, Helper sprawdził, czy plik istnieje, a w razie gdyby nie istniał – musiałby ‘poprosić’ komponent o aktualizację pliku. A to jest w konflikcie z tym co napisałem przy okazji Dobrych praktyk #2 – Helper nie może używać kontrolera, ani komponentu.

I tu się wydarzyła rzecz ciekawa, w tym poście chciałem napisac o problemie, na który nie widzę dobrego sposobu. Chciałem przedstawić ideę pierwszego podejścia.
Dla bardziej przejrzystego przekazania idei postanowiłem zbudowac diagram i uświadomiłem sobie jak bardzo wizualizacja pomaga w zrozumieniu problemu.
A od zrozumienia problemu do jego rozwiązania jest raczej niedaleko.

No i w tym momencie wpadłem na pomysł bez komponentu i bez Helpera, ale za to sam Behavior. Myślę sobie, że Behaviors są rozszerzeniem Modeli, które odpowiadają za warstwę przechowywania danych.
Pomysł jest taki, że -pomijając kwestię uploadu i sapisu – behavior w afterRead() sprawdził, czy plik fizycznie jest aktualny, jeśli jest – zwróci jego nazwę. Jeśli nie jest – utworzy go na podstawie danych w bazie (koniecznie z inną nazwą) i zwróci jego nazwę (relatywną do img/) ścieżką.

Sprawdzę to empirycznie i napiszę Wam jak poszło.

Share Button

Leave a Reply

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