BLOB hoặc tài liệu tham khảo trong PostgreSQL


11

Tôi cần lưu trữ các tệp dữ liệu nhị phân trong cơ sở dữ liệu PostgreSQL chạy trên máy chủ Ubuntu. Ban đầu, sẽ có vài chục tệp có kích thước khoảng 250kb mỗi tệp. Tuy nhiên, số lượng tệp sẽ tăng theo thời gian. Đôi khi tôi có thể cần trích xuất dữ liệu từ các tệp cho các phân tích tiếp theo khác.

Tôi đã thực hiện một số nghiên cứu liên quan đến câu hỏi lâu đời về việc lưu trữ dữ liệu nhị phân dưới dạng BLOB hoặc tài liệu tham khảo. Cả hai rõ ràng có ưu và nhược điểm của họ. Có bất kỳ vấn đề cụ thể nào liên quan đến PostgreSQL mà tôi nên biết không? Là một phương pháp hay phương pháp khác thích hợp hơn nếu tôi muốn trích xuất dữ liệu từ các tệp, thông qua chức năng PostgreQuery hoặc thông qua chương trình Python bên ngoài?

Nếu tôi lưu trữ các tệp dữ liệu trực tiếp trong cơ sở dữ liệu, tốt hơn là lưu trữ chúng trong một bảng riêng biệt có khóa ngoại tham chiếu bảng "chính", thay vì trong bảng chứa tất cả các trường khác?

Tôi đã đọc câu hỏi và câu trả lời ở đây ; một nhận xét cho thấy rằng lưu trữ tệp nhị phân theo tham chiếu (trong hệ thống tệp) trên Linux là tốt hơn. Các câu hỏi của tôi ở đây liên quan đến PostgreSQL cụ thể và trích xuất dữ liệu từ các tệp cho các phân tích khác nhau.

Cập nhật: Câu hỏi tương tự .


Với PostgreSQl, có thể thiết lập quy tắc tự động xóa tệp trong hệ thống tệp khi bản ghi chứa tham chiếu bị xóa.
jp

Tôi chắc chắn đã có nhiều hơn một câu trả lời cho câu hỏi này. Chuyện gì đã xảy ra với nó? Có cách nào để xem nó nếu người đăng đã xóa nó? Còn những bình luận về nó thì sao?
SabreWolfy

Có, tôi đã xóa nó, vì các vấn đề về hiệu suất với bytea tôi đã viết có thể tránh được. Các ý kiến ​​có thể được tóm tắt bằng "Mọi thứ đều ổn với bytea, bạn chỉ cần đảm bảo rằng bạn không thoát các ký tự không in được trong cơ sở dữ liệu và sau đó bỏ thoát chúng một lần nữa trong ứng dụng của bạn. Thay vào đó, araqnid đã nhận xét thoát hex được hỗ trợ bởi libpq. "
jp

Câu trả lời:


9

Tôi nghĩ bạn nên lưu trữ dữ liệu trong cơ sở dữ liệu như một byteacột bình thường . Bằng cách đó, bạn có được tất cả các lợi thế của cơ sở dữ liệu và bạn có thể xử lý dữ liệu bằng các hàm cơ sở dữ liệu (và thậm chí PL / Python, nếu bạn muốn điều đó). Các mục dữ liệu lớn hơn sẽ tự động được lưu trữ ngoài dòng, vì vậy sẽ không có lý do gì để bạn giới thiệu một hướng dẫn tham chiếu khác.

Lý do chính để lưu trữ các đối tượng nhị phân lớn bên ngoài cơ sở dữ liệu là nếu chúng quá lớn để có thể lưu trữ và truy xuất chúng trong thời gian thỏa đáng, nếu chúng làm mờ cơ sở dữ liệu ngoài thực tế hoặc nếu bạn cần truy cập các tệp dưới dạng tệp từ một ứng dụng riêng biệt. Không ai trong số đó áp dụng ở đó, như tôi có thể nói.


Cảm ơn các chi tiết. Quan điểm của bạn về việc truy cập các tệp từ một ứng dụng riêng biệt khiến tôi nhận ra rằng trong tương lai tôi có thể muốn cho phép người dùng tải xuống tệp nhị phân để sử dụng cục bộ trên máy của họ. Điều đó có thể được thực hiện nếu tập tin được lưu trữ trong cơ sở dữ liệu?
SabreWolfy

Chắc chắn rồi. Bạn sẽ cần phải viết một đoạn mã nhỏ để sắp xếp cho việc đó (tìm nạp dữ liệu tệp từ cơ sở dữ liệu, sắp xếp tải xuống HTTP, giả sử), nhưng đó không phải là trình chặn.
Peter Eisentraut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.