Tôi làm việc trên một hệ thống phần mềm lớn đã thực hiện cả hai cơ chế lưu trữ tệp đính kèm và nội dung khác. Lần lặp đầu tiên của hệ thống đã lưu trữ tất cả dữ liệu trong BLOB trong DB. Tôi đã nguyền rủa nó vào thời điểm đó. Là một lập trình viên, tôi có thể viết các tập lệnh bên để vận hành ngay dữ liệu và thay đổi nó bất cứ khi nào tôi muốn.
Trước đây khoảng 10 năm và tôi vẫn quản lý cùng một phần mềm nhưng kiến trúc đã thay đổi và nó được viết bằng con trỏ hệ thống tệp. Tôi nguyền rủa nó ngay bây giờ và ước nó đã trở lại trong DB. Tôi đã có thêm lợi ích trong vài năm và đã làm việc ứng dụng này với khả năng lớn hơn nhiều trong nhiều tình huống lớn hơn và nhiều hơn nữa, tôi cảm thấy quan điểm của mình bây giờ đã được giáo dục tốt hơn. Việc quảng cáo hoặc di chuyển hệ thống của ứng dụng yêu cầu phải tạo tập lệnh và sao chép rộng rãi hàng triệu tệp. Có một lần, chúng tôi đã thay đổi hệ điều hành và tất cả các con trỏ tệp có dấu phân tách thư mục sai hoặc tên máy chủ thay đổi vị trí của tệp và chúng tôi phải viết và lên lịch các câu lệnh cập nhật SQL đơn giản với DBA vào cuối tuần để khắc phục. Một vấn đề khác là hệ thống tệp và bản ghi DB không đồng bộ, tại sao không chắc chắn nhưng sau hàng nghìn ngày hoạt động, đôi khi các hệ thống không giao dịch (hệ thống tệp và DB không chia sẻ bối cảnh giao dịch) đơn giản trở nên không đồng bộ. Đôi khi các tệp bị mất tích một cách bí ẩn.
Khi tất cả những điều này nằm trong DB, việc di chuyển hoặc xúc tiến môi trường là vấn đề của việc kết xuất và nhập DB. Các thay đổi hàng có thể được kiểm tra đúng cách, mọi thứ đồng bộ hóa và nhật ký có thể được phát lại theo thời điểm nếu cần thiết. Chắc chắn DB trở nên lớn, nhưng đó là năm 2011 và công cụ này đơn giản không phải là một thách thức đối với cơ sở dữ liệu.
Đối với những gì đáng giá, chúng tôi đã gặp một số vấn đề tương tự với bộ đệm dữ liệu lớn khi phát trực tuyến một số dữ liệu, nhưng A) chúng tôi có thể bơm dữ liệu trong bộ đệm byte với Input | OutputStreams trong JDBC và B) khi sử dụng các công cụ khác, chúng tôi đã viết một thủ tục được lưu trữ điều đó sẽ chia khối BLOB thành một bảng tạm thời và phân phối lặp đi lặp lại các phần từ bảng tạm thời. Hoạt động tốt.
Tôi không quan tâm lý do kỹ thuật cho việc không đưa nội dung này vào DB, nhưng nó dễ dàng hơn rất nhiều để quản lý ở một địa điểm hợp nhất, tôi có thể tăng gấp đôi và gấp ba phần cứng hoặc lưới DB cho thời gian bị lãng phí bởi các nhà tư vấn và khách hàng chỉ trong một khoảng thời gian ngắn để quản lý các tệp khác nhau.
Cập nhật:hãy thoải mái với những người bình luận, họ chỉ đưa ra ý kiến của mình về vấn đề này.