Gumpalan atau referensi di PostgreSQL

11

Saya perlu menyimpan file data biner dalam database PostgreSQL yang berjalan di server Ubuntu. Awalnya akan ada beberapa lusin file dengan ukuran masing-masing sekitar 250kb. Namun, jumlah file akan meningkat seiring waktu. Kadang-kadang saya perlu mengekstrak data dari file untuk analisis hilir lainnya.

Saya telah melakukan beberapa penelitian tentang pertanyaan lama menyimpan data biner sebagai BLOB atau referensi. Keduanya jelas memiliki pro dan kontra. Apakah ada masalah khusus yang berkaitan dengan PostgreSQL yang harus saya ketahui? Apakah satu metode atau yang lain lebih disukai jika saya ingin mengekstrak data dari file, baik melalui fungsi PostgreSQL atau melalui program Python eksternal?

Jika saya menyimpan file data secara langsung dalam database, apakah lebih baik menyimpannya dalam tabel terpisah dengan kunci asing yang merujuk pada tabel "utama", daripada di tabel yang berisi semua bidang lainnya?

Saya telah membaca pertanyaan dan jawaban di sini ; komentar di sana menunjukkan bahwa menyimpan file biner dengan referensi (dalam sistem file) di Linux lebih baik. Pertanyaan saya di sini berkaitan dengan PostgreSQL secara khusus dan untuk mengekstraksi data dari file untuk berbagai analisis.

Perbarui: Pertanyaan serupa .

SabreWolfy
sumber
Dengan PostgreSQl dimungkinkan untuk membuat aturan yang secara otomatis menghapus file dalam sistem file ketika catatan yang berisi referensi dihapus.
jp
Saya yakin ada lebih dari satu jawaban untuk pertanyaan ini. Apa yang terjadi dengannya? Apakah ada cara untuk melihatnya jika poster itu menghapusnya? Bagaimana dengan komentar di atasnya?
SabreWolfy
Ya, saya menghapusnya, karena masalah kinerja dengan bytea yang saya tulis dapat dihindari. Komentar dapat diringkas dengan "Semuanya baik-baik saja dengan bytea, Anda hanya perlu memastikan bahwa Anda tidak melarikan diri karakter yang tidak dapat dicetak dalam database dan kemudian melepaskannya lagi di aplikasi Anda. Seperti komentar araqnid, Anda sebaiknya menggunakan hex melarikan diri yang didukung oleh libpq. "
jp

Jawaban:

9

Saya pikir Anda harus menyimpan data dalam database sebagai byteakolom normal . Dengan cara itu Anda mendapatkan semua keuntungan dari database, dan Anda dapat memproses data menggunakan fungsi basis data (dan bahkan PL / Python, jika Anda menginginkannya). Item data yang lebih besar akan secara otomatis disimpan di luar jalur, sehingga tidak ada alasan bagi Anda untuk memperkenalkan tipuan referensi lain.

Alasan utama untuk menyimpan objek biner besar di luar database adalah jika mereka terlalu besar untuk dapat menyimpan dan mengambilnya dalam waktu yang memuaskan, jika mereka menggembungkan database di luar kepraktisan, atau jika Anda perlu mengakses file sebagai file dari aplikasi terpisah. Tidak ada yang berlaku di sana, sejauh yang saya tahu.

Peter Eisentraut
sumber
Terima kasih untuk detailnya. Maksud Anda tentang mengakses file dari aplikasi terpisah membuat saya menyadari bahwa di masa depan saya ingin mengizinkan pengguna untuk mengunduh file biner untuk digunakan secara lokal di mesin mereka. Bisakah itu dilakukan jika file tersebut disimpan dalam database?
SabreWolfy
Tentu. Anda perlu menulis sedikit kode untuk mengaturnya (mengambil data file dari basis data, mengatur unduhan HTTP, katakanlah), tetapi itu bukan pemblokir.
Peter Eisentraut