Czy ktoś z was udzieliłby porady w jaki sposób przechowywać dokumenty PDF, obrazy i inne pliki w bazie ? Jak to się robi profesjonalnie ?
Silnik bazy danych to MariaDB
Dlaczego chciałbyś trzymać te dokumenty w bazie danych?
Jak to się robi profesjonalnie ?
Wysyła pliki na S3 albo podobny storage.
https://mariadb.com/kb/en/blob-and-text-data-types/ - jak koniecznie chcesz to robic
bo chcę napisać program, który te dane będzie wyszukiwał i przechowywał
Tak właśnie funkcjonuje 99% aplikacji :-) Nie odpowiedziałeś jednak na moje pytanie: dlaczego akurat MariaDB?
Co to jest S3 ?
https://aws.amazon.com/s3/ (istnieją też warianty self-hosted jak minio
oraz inne usługi webowe jak Google Buckets)
Tak właśnie funkcjonuje 99% aplikacji :-) Nie odpowiedziałeś jednak na moje pytanie: dlaczego akurat MariaDB?
Bo jest darmowa, bo lubię, bo mam :D
gdzieś czytałem, że zamiast pakować dane do bazy, to najlepiej pliki wysłać na FTP, a w bazie trzymać ścieżkę do pliku
gdzieś czytałem, że zamiast pakować dane do bazy, to najlepiej pliki wysłać na FTP, a w bazie trzymać ścieżkę do pliku
To też jest możliwa opcja - tak w przybliżeniu działa S3 (pomijając takie drobnostki jak uprawnienia czy propagowanie danych do CDNów :-)).
S3 (oraz podobne rozwiązania) są o tyle wygodne, że nie wymagają serwowania zasobów z Twojego serwera (tj. nie obciążają bazy danych oraz serwera HTTP na wysyłanie obrazków do użytkowników).
Profesjonalnie to robi się tak że metadane lądują w bazie a pliki (które mogą być bardzo duże e.g. 30 MB skany) w osobnej usłudze (S3 lub własna).
Wtedy wyszukiwanie jest nadal możliwe i szybkie. Wiele rzeczy takich jak backupy bazy czy migracje schematu czy sprawdzanie plików pod kątem malewareu się upraszczają.
Na prawdziwie pro poziomie używa się ElasticSearcha + full text search razem ze zbiorem narzędzi które dokonują extrakcji textu i metadanych z różnych formatów. Wyszukiwanie tekstu np. dla języka polskiego to coś więcej niż LIKE bo trzeba uwzględnić np. odmianę i końcówki.
widzę, że na ciekawie wątek się rozwija
Profesjonalnie to robi się tak że metadane lądują w bazie (...)
skąd się bierze te "metadane" ?
Wtedy wyszukiwanie jest nadal możliwe i szybkie. Wiele rzeczy takich jak backupy bazy czy migracje schematu czy sprawdzanie plików pod kątem malewareu się upraszczają.
czyli dajesz mi do zrozumienia, że lepiej wysłać plik na FTP, a w bazie trzymać ścieżkę do pliku ? Czyli podsumowując, jest to najlepsze rozwiązanie ?
O ile te dane mają być publiczne. Popraw mnie jeśli sie mylę, ale szukałem wiele razy jak ograniczać dostęp do plików dla konkretnych osób a jednocześnie nie przesyłać plików
tego już nie rozumiem ? Czemu to ma służyć ? I jaki jest tego cel ?
True - o ile dane mają (lub przynajmniej mogą) być publiczne; w przeciwnym razie również nie znam innego sposobu niż przez własne proxy
a dlaczego własne proxy ? Pytania jak wyżej. Czemu ? Jaki jest cel ?
Ale jaki cel czego? Uprawnień do plików? No to chyba normalne, że większość plików jest takich które nie powinny być dostępne np dla gościa i wtedy trzeba zablokować dostęp do takich plików, a jedyny sposób, to pilnowanie tego w swoim kodzie.
zkubinski napisał(a):
Tak właśnie funkcjonuje 99% aplikacji :-) Nie odpowiedziałeś jednak na moje pytanie: dlaczego akurat MariaDB?
Bo jest darmowa, bo lubię, bo mam :D
Masz na kompie, czy na hostingu?
Hostingodawca na pewno Ci wyrazi ciepłe uczucia, na czas operacji z 30 MB blobem żarówki przygasną.
Zawsze jako alternatywa możesz pomyśleć nad baza która wspiera zapisywanie plików. Np. RavenDB ma załączniki do dokumentów (rekordów). Możesz zapisać jakiś obiekt i dołączyć powiązane z nim pliki.
Przyznam że w MariaDB innego rozwiązania jak trzymanie ścieżki do pliku chyba bym nie zastosował bo pchanie plików jako blob'ów do bazy ... no ma pewne swoje konsekwencje. Fajnie rozwiązał to Microsoft w SQL Serverze poprzez FileStream https://codingsight.com/storing-files-in-sql-database-using-filestream-part1/
Niestety nie znalazłem odpowiednika w MariaDB
woolfik napisał(a):
Przyznam że w MariaDB innego rozwiązania jak trzymanie ścieżki do pliku chyba bym nie zastosował bo pchanie plików jako blob'ów do bazy ... no ma pewne swoje konsekwencje. Fajnie rozwiązał to Microsoft w SQL Serverze poprzez FileStream https://codingsight.com/storing-files-in-sql-database-using-filestream-part1/
Niestety nie znalazłem odpowiednika w MariaDB
Na polecenie klienta pchałem do bazy 1GB pliki i powiem jedno. Było to złe. Największym naszym zdziwieniem było to jak wolne jest usuwanie plików z bazy. I potem trzeba było implementować asynchroniczne usuwanie plików bo to przecież nienormalne żeby tyle czekać na usunięcie czegoś skoro normalny plik w systemie plików usuwa się szybko XD
w sumie ja tam dużych plików pchał nie będę - max może 10mb
A tak z ciekawości, co polecacie do dużych plików ?
10 mega to już dużo. Takie pliki najlepiej trzymać po prostu na dysku.
Tak jak @mr_jaro napisał jest najwydajeniej (moim zdaniem) natomist przewaga tego filestream'a w MSSQL jest taka, że plików nie usuniesz z dysku nawet z explorera windows bo usługa bazy danych blokuje taką możliwość. Przydaje się gdy np inny proces operuje na plikach, inny je archiwizuje, a jeszcze inny operuje na bazie danych :)
Ekstraktować można w różny sposób np. https://tika.apache.org/
No tylko trzeba pamiętać o bezpieczeństwie, dlatego najlepiej plik najpierw przeskanować a potem wyciągać metadane.
Popatrz też na to: https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/ingest-attachment.html
Trzymanie plików na dysku, a w bazie tylko ścieżek prosi się o kłopoty ze spójnością. Np. bekap. Jak wymusić aby baza i zawartość file systemu były spójne na określony czas ? Jeśli wszystko będzie w bazie to baza zagwarantuje spójność i możliwość odtworzenia point-in-time. Zachęcam do Oracle. Ma taki ficzer jak SecureFile - kompresuje zawartość plików i deduplikuje. Również zaszyfruje jeśli wola. Niestety ekstra płatny ;-)
@Marcin Badtke: az sprawdziłem profil i posty - bazodanowiec, trudno było nie zgadnąć ;].
Może trzymanie tylko nazwy pliku/ścieżki grozi brakiem spójności, ale trzymanie plików w BD grozi brakiem użytkowników z powodu powolnej aplikacji ;p
Jak korzysta się z rozwiązań chmurowych to problem jest dużo mniejszy bo buckupy plików są za warstwą abstrakcji
Aż tak bardzo bym nie krytykował, niektóre bazy mają wsparcie do przechowywania plików na dysku np. https://www.sqlshack.com/filestream-in-sql-server/
Minus tego rozwiązania jest taki że jak będziemy chcieli zmienić bazę danych to możemy mieć problem.
Tutaj Postgre ma pięknie wymienione wady i zalety obu rozwiązań: https://wiki.postgresql.org/wiki/BinaryFilesInDB
Ja preferuje trzymać pliki typu dokumenty (PDF, docx, xls, zip) poza bazą. Ale dużo zależy od ilości i rozmiaru tych plików. Jeżeli tam będzie 1GB na rok dokumentów, to pewnie każdy SQL da radę...
Jeżeli coś by mnie odrzucało od Oracle czy M$ SQL Server to koszty licencji. Po co płacić jeżeli można mieć za darmo MySQL (aka Maria) lub PostgreSQLa? Rozumiem jeszcze duży biznes który nie chce Sparka i woli mieć BI na M$ SQL Server, ale dla startup'ów czy małych firm to się IMHO w ogóle nie opłaca...