MariaDB - przechowywanie dokumentów różnych formatów w bazie

0

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

4

Dlaczego chciałbyś trzymać te dokumenty w bazie danych?

Jak to się robi profesjonalnie ?

Wysyła pliki na S3 albo podobny storage.

1

https://mariadb.com/kb/en/blob-and-text-data-types/ - jak koniecznie chcesz to robic

3

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)

0

@Patryk27:

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

1

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

3

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.

0

widzę, że na ciekawie wątek się rozwija

@0xmarcin

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 ?

@mr_jaro

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 ?

@Patryk27

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 ?

1

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.

2
zkubinski napisał(a):

@Patryk27:

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ą.

1

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.

https://ravendb.net/docs/article-page/5.0/csharp/document-extensions/attachments/what-are-attachments

4

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

2
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

0

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 ?

3

10 mega to już dużo. Takie pliki najlepiej trzymać po prostu na dysku.

0

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

0

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

0

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 ;-)

1

@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

1

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1