BLOB lub odniesienia w PostgreSQL

11

Muszę przechowywać pliki danych binarnych w bazie danych PostgreSQL, która działa na serwerze Ubuntu. Początkowo będzie kilkadziesiąt plików o wielkości około 250 KB każdy. Z czasem liczba plików wzrośnie. Czasami może być konieczne wyodrębnienie danych z plików w celu przeprowadzenia dalszych analiz.

Przeprowadziłem badania dotyczące odwiecznego problemu przechowywania danych binarnych jako BLOBów lub referencji. Oba oczywiście mają swoje zalety i wady. Czy są jakieś szczególne problemy związane z PostgreSQL, o których powinienem wiedzieć? Czy jedna metoda jest lepsza, jeśli chcę wyodrębnić dane z plików, albo za pomocą funkcji PostgreSQL, albo zewnętrznego programu Python?

Gdybym miał przechowywać pliki danych bezpośrednio w bazie danych, czy lepiej byłoby przechowywać je w osobnej tabeli z kluczem obcym odwołującym się do tabeli „głównej”, niż w tabeli zawierającej wszystkie pozostałe pola?

Muszę przeczytać pytanie tutaj ; komentarz sugeruje, że przechowywanie plików binarnych przez odniesienie (w systemie plików) w systemie Linux jest lepsze. Moje pytania dotyczą konkretnie PostgreSQL i ekstrakcji danych z plików do różnych analiz.

Aktualizacja: podobne pytanie .

SabreWolfy
źródło
W PostgreSQl można ustawić regułę, która automatycznie usuwa plik w systemie plików po usunięciu rekordu zawierającego odwołanie.
jp.
Jestem pewien, że na to pytanie była więcej niż jedna odpowiedź. Co się z tym stało? Czy istnieje sposób, aby to zobaczyć, jeśli plakat go usunął? Co z komentarzami na ten temat?
SabreWolfy
Tak, usunąłem go, ponieważ można uniknąć problemów z wydajnością z bajtem, o którym pisałem. Komentarze można streścić w następujący sposób: „Wszystko jest w porządku z bytea, powinieneś tylko upewnić się, że nie unikniesz znaków niedrukowalnych w bazie danych, a następnie odblokujesz je ponownie w aplikacji. Jak komentował araqnid, powinieneś użyć heksowanie, które jest obsługiwane przez libpq. ”
JP

Odpowiedzi:

9

Myślę, że powinieneś przechowywać dane w bazie danych jako normalną byteakolumnę. W ten sposób zyskujesz wszystkie zalety bazy danych i możesz przetwarzać dane za pomocą funkcji bazy danych (a nawet PL / Python, jeśli chcesz). Większe elementy danych będą automatycznie przechowywane poza linią, więc nie byłoby powodu, aby wprowadzać inną pośrednią referencję.

Głównymi przyczynami przechowywania dużych obiektów binarnych poza bazą danych jest to, że są one zbyt duże, aby można je było przechowywać i odzyskiwać w zadowalającym czasie, jeśli nadmuchują one bazę danych poza praktyczność lub jeśli potrzebujesz dostępu do plików jako plików z osobna aplikacja. O ile mi wiadomo, nic z tego nie ma zastosowania.

Peter Eisentraut
źródło
Dziękuję za szczegóły. Twoja uwaga na temat dostępu do plików z oddzielnej aplikacji uświadomiła mi, że w przyszłości mogę zezwolić użytkownikom na pobieranie pliku binarnego i używanie go lokalnie na ich komputerze. Czy można to zrobić, jeśli plik jest przechowywany w bazie danych?
SabreWolfy
Pewnie. Będziesz musiał napisać trochę kodu, aby to zorganizować (pobieranie danych pliku z bazy danych, organizowanie pobierania HTTP, powiedzmy), ale to nie jest bloker.
Peter Eisentraut