BLOB або посилання в PostgreSQL


11

Мені потрібно зберігати бінарні файли даних у базі даних PostgreSQL, яка працює на сервері Ubuntu. Спочатку буде кілька десятків файлів розміром приблизно 250 кбіт. Однак кількість файлів з часом збільшиться. Можливо, мені іноді знадобиться витягнути дані з файлів для інших аналізів нижче.

Я провів декілька досліджень стосовно вікового питання щодо зберігання бінарних даних як BLOB або посилань. У обох очевидно є свої плюси і мінуси. Чи є якісь конкретні проблеми, пов'язані з PostgreSQL, про які я маю знати? Чи бажаний той чи інший метод, якщо я хочу отримати дані з файлів, або через функцію PostgreSQL, або через зовнішню програму Python?

Якби я мав зберігати файли даних безпосередньо в базі даних, чи було б краще зберігати їх в окремій таблиці із зовнішнім ключем, що посилається на "головну" таблицю, а не в таблиці, що містить усі інші поля?

Я прочитав питання і відповіді тут ; коментар там говорить про те, що краще зберігати бінарні файли за посиланням (у файловій системі) на Linux. Мої запитання тут стосуються PostgreSQL, зокрема, та вилучення даних з файлів для різних аналізів.

Оновлення: Аналогічне запитання .


За допомогою PostgreSQl можна встановити правило, яке автоматично видаляє файл у файловій системі при видаленні запису, що містить посилання.
— jp

Я впевнений, що відповіді на це питання було більше. Що з ним сталося? Чи є спосіб це побачити, якщо плакат видалив його? А як щодо коментарів до цього?
— SabreWolfy

Так, я видалив її, оскільки проблем із продуктивністю bytea, про які писав, можна уникнути. Зауваження можна узагальнити за допомогою "Все добре з bytea, ви просто переконайтеся, що ви не уникаєте недрукувальних символів у базі даних, а потім знову не скасовуйте їх у своїй програмі. Як зазначив araqnid, замість цього вам слід використовувати шестнадцятковий втечу, який підтримується libpq. "
— jp

Відповіді:


9

Я думаю, ви повинні зберігати дані в базі даних як звичайний byteaстовпець. Таким чином ви отримуєте всі переваги бази даних, і можете обробляти дані за допомогою функцій бази даних (і навіть PL / Python, якщо цього хочете). Більш великі елементи даних автоматично зберігатимуться поза рядком, тому не було б причин вводити інше опорне непряме.

Основними причинами зберігання великих бінарних об'єктів за межами бази даних будуть, якщо вони занадто великі, щоб можна було зберігати та витягувати їх у задовільний час, якщо вони роздувають базу даних поза практичністю, або якщо вам потрібно отримати доступ до файлів як файлів з окремий додаток. Нічого із цього не стосується, наскільки я можу сказати.


Дякуємо за деталі. Ваша думка про доступ до файлів із окремої програми спонукала мене до того, що я можу в майбутньому дозволити користувачам завантажувати бінарний файл для локального використання на своїй машині. Це можна зробити, якщо файл зберігається в базі даних?
— SabreWolfy

Звичайно. Вам потрібно буде написати невеликий біт коду, щоб домогтися цього (отримання файлових даних із бази даних, упорядкування завантаження HTTP, скажімо), але це не блокатор.
— Пітер Ейзентраут
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.