Vì mục đích đơn giản, giả sử tôi đang phát triển một ứng dụng dành cho thiết bị di động như Instagram. Người dùng có thể tải xuống hình ảnh từ máy chủ và tải lên hình ảnh của riêng họ. Hiện tại, máy chủ lưu trữ tất cả các hình ảnh (trong thực tế, chỉ các hình nhỏ) trong cơ sở dữ liệu MySQL dưới dạng BLOB. Dường như cách phổ biến nhất để chuyển hình ảnh là sử dụng mã hóa Base64, để lại cho tôi hai tùy chọn:MySQL - Base64 vs BLOB
- Máy chủ lưu trữ tất cả hình ảnh dưới dạng BLOB. Để tải lên một hình ảnh, khách hàng mã hóa nó thành chuỗi Base64, sau đó gửi nó đến máy chủ. Máy chủ giải mã hình ảnh BACK thành định dạng nhị phân và lưu trữ nó dưới dạng BLOB trong cơ sở dữ liệu. Khi khách hàng yêu cầu một hình ảnh, máy chủ sẽ mã hóa lại hình ảnh dưới dạng chuỗi Base64 và gửi nó cho khách hàng, sau đó giải mã nó trở lại dạng nhị phân để hiển thị.
- Máy chủ lưu trữ tất cả hình ảnh dưới dạng chuỗi Base64. Để tải lên một hình ảnh, khách hàng mã hóa nó thành chuỗi Base64 và gửi nó đến máy chủ. Máy chủ không mã hóa hoặc giải mã, nhưng chỉ lưu trữ chuỗi trong cơ sở dữ liệu. Khi khách hàng yêu cầu một hình ảnh, chuỗi Base64 được trả lại cho khách hàng, sau đó giải mã nó để hiển thị.
Rõ ràng, tùy chọn # 1 yêu cầu xử lý đáng kể hơn trên máy chủ, vì hình ảnh phải được mã hóa/giải mã với mọi yêu cầu. Điều này làm cho tôi nghiêng về phía tùy chọn # 2, nhưng một số nghiên cứu đã gợi ý rằng việc lưu trữ chuỗi Base64 trong MySQL kém hiệu quả hơn nhiều so với lưu trữ hình ảnh trực tiếp dưới dạng BLOB và thường không được khuyến khích.
Tôi chắc chắn không phải là người đầu tiên gặp phải tình huống này, vì vậy không ai có đề xuất về cách tốt nhất để thực hiện công việc này?
Tùy chọn # 3 không có hình ảnh trong cơ sở dữ liệu ở nơi đầu tiên. Họ có một hệ thống cho việc này: Hệ thống tập tin. – tadman
Tôi bắt đầu lưu trữ đường dẫn tệp, nhưng một số nghiên cứu về các phiên bản gần đây nhất của MySQL đã gợi ý rằng nó thực sự hiệu quả hơn để lưu trữ các tệp nhỏ (dưới 1 hoặc 2 mb) dưới dạng BLOB. Hình ảnh của tôi chỉ là một vài kb, vì vậy nó dễ dàng hơn nhiều để duy trì theo cách này. – hundley
Sao lưu cơ sở dữ liệu đầy BLOB là một cơn ác mộng tuyệt đối. Nó đắt tiền để tái tạo những thứ này, tốn kém để sao lưu chúng, cực kỳ đau đớn để khôi phục chúng, và kích thích để phân chia chúng khi chúng trở nên quá lớn. Trừ khi bạn đang đối phó với số lượng dữ liệu không quan trọng, điều này sẽ thổi lên bạn cuối cùng. Các tệp trên đĩa có thể được sao chép dễ dàng bằng cách sử dụng một cái gì đó thô sơ như 'rsync'. Tương tự cũng không đúng cho MySQL. – tadman