2010-04-28 63 views
5

Tôi đang viết ứng dụng web bằng cách sử dụng ASP.NET MVC + NHibernate + Postres stack. Tôi tự hỏi nếu hình ảnh được tải lên nên được lưu trữ trong cơ sở dữ liệu như các đốm màu nhị phân hoặc trên hệ thống tập tin (và chỉ tham khảo trong db). Một ưu điểm của lưu trữ db mà tôi có thể nghĩ là sao lưu/khôi phục dễ dàng tất cả dữ liệu mà không cần hoàn nguyên công cụ sao chép hệ thống tệp. Mặt khác, tôi nghi ngờ rằng truy cập hệ thống tập tin có thể nhanh hơn (nhưng nó đặc biệt là khi giao dịch với nhiều yêu cầu đồng thời?) Đề xuất của bạn là gì?Vị trí cửa hàng tải lên hình ảnh MVC ASP.NET (db vs filesystem)

+2

Bản sao có thể có của http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – Cesar

+1

Trên máy chủ CDN chuyên dụng? – Paco

Trả lời

2

Tôi muốn đảm bảo cả hình ảnh được lưu trữ trong cơ sở dữ liệu sao cho tất cả dữ liệu được tập trung để sao lưu dễ dàng, nhưng cũng lưu dữ liệu bên ngoài để các yêu cầu lặp lại kho dữ liệu. Thực hiện đúng cách, bạn có thể mang lại các máy chủ web giao diện người dùng mới sẽ hiển thị rõ ràng bộ nhớ cache hình ảnh cục bộ của chúng từ cơ sở dữ liệu sau khi khởi động.

Có một cửa hàng tập trung cho hình ảnh cũng hữu ích để đảm bảo bạn gửi tiêu đề phản hồi HTTP được sửa đổi lần cuối và ETAG tốt cho hình ảnh trong một hệ thống có nhiều máy chủ web, vì các tiêu đề đó có thể được tạo từ nội dung cơ sở dữ liệu thay vì từ các đối tượng bộ nhớ cache cục bộ.

Chỉ cần lưu ý thực hiện cho PostgreSQL: bạn có thể đặt "chế độ lưu trữ" của cột chứa dữ liệu hình ảnh thành "bên ngoài": điều này sẽ dừng PostgreSQL cố gắng nén dữ liệu hình ảnh (sử dụng zlib, có khả năng cung cấp bất kỳ lợi ích nào) và sẽ làm cho nó lưu trữ dữ liệu hình ảnh trong bảng TOAST phụ trợ, cung cấp hiệu suất tốt hơn nếu bạn chỉ đang truy vấn siêu dữ liệu hình ảnh. Hãy xem phần "SET LƯU TRỮ" khoản của lệnh ALTER TABLE, ví dụ .:

ALTER TABLE media.image ALTER COLUMN content SET STORAGE EXTERNAL 
1

Điều đó tùy thuộc. Bạn có giá trị có thể liên kết trực tiếp đến một hình ảnh hay bạn muốn luôn sử dụng tài nguyên phía máy chủ để gọi cho DB và sau đó ghi dữ liệu nhị phân cho hình ảnh?

2

Chúng tôi sử dụng lưu trữ bản gốc bằng cơ sở dữ liệu để sao lưu, nhưng tạo ra thu nhỏ lại hình ảnh được lưu trữ trên hệ thống tập tin trên máy chủ web.

Tuy nhiên, chúng tôi cố gắng tránh mọi vòng lặp tới cơ sở dữ liệu nếu có thể, vì nó tạo tải rất lớn vì một trang thường gọi một số yêu cầu hình ảnh cho mỗi lần xem trang.

Một lưu ý về lưu trữ các đốm màu trong cơ sở dữ liệu, tôi khuyên bạn nên lưu các cột blob thực tế trong một bảng chuyên dụng, với ánh xạ một-một cho thực thể/thực thể của bạn. Điều này sẽ dễ dàng sao lưu, cũng như thay đổi các bảng của bạn. Khi một bảng lớn lên, mọi thay đổi sẽ mất "mãi mãi" để hoàn thành và khóa là một vấn đề lớn, ngay cả khi sao lưu.

Nếu bạn có tất cả thông tin về hình ảnh (ngoại trừ dữ liệu nhị phân), dữ liệu đó sẽ không bị ảnh hưởng trừ khi bạn cần dữ liệu nhị phân (mà bạn hiếm khi cần vì nó sẽ được lưu trong hệ thống tệp).

Chỉ hai xu của tôi.

+0

Cơ sở dữ liệu khác nhau có các cách tiếp cận khác nhau để lưu trữ các đốm màu: postgresql sẽ tự động lưu trữ các giá trị bytea lớn ngoài dòng trong bảng "bánh mì nướng" riêng biệt, vì vậy không cần phải làm điều này một cách rõ ràng. – araqnid

+0

Trong thực tế, để lưu trữ dữ liệu hình ảnh, có lẽ nên sử dụng "thay đổi bảng ... thay đổi cột ... đặt bộ nhớ ngoài" để buộc lưu trữ ngoài dòng tất cả thời gian và tắt tính năng nén. – araqnid

+0

Hm, điều đó lạ vì chúng tôi sử dụng postgres và tôi gặp vấn đề với việc khóa bảng khi thay đổi bảng và sao lưu nó. – jishi

Các vấn đề liên quan