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.