Lưu trữ hình ảnh dưới dạng tệp hoặc trong cơ sở dữ liệu cho một ứng dụng web?


124

Câu hỏi của tôi khá chung chung và tôi biết có thể không có câu trả lời 100% cho nó. Tôi đang xây dựng một giải pháp web .NET .NET sẽ bao gồm rất nhiều hình ảnh và hy vọng sẽ có lưu lượng truy cập khá. Tôi thực sự muốn đạt được hiệu suất.

Tôi nên lưu hình ảnh trong Cơ sở dữ liệu hoặc trên hệ thống Tệp? Và bất kể câu trả lời tôi quan tâm hơn tại sao chọn một cách cụ thể.

Rất cám ơn, Stefan

DUPLICATE : Lưu trữ hình ảnh trong DB - Yea hay Nay? , Làm thế nào để lưu trữ hình ảnh trong hệ thống tập tin của bạn , Lưu trữ một số lượng nhỏ hình ảnh: blob hoặc fs? và có lẽ một số người khác.


NHẬN XÉT: Cảm ơn nhiều câu trả lời hay. Tôi sẽ đi đến một giải pháp dựa trên tập tin ngay cả khi tôi thích ý tưởng có một giải pháp dựa trên cơ sở dữ liệu 100%. Có vẻ như ngày nay có những giải pháp tốt để làm những gì tôi muốn với cơ sở dữ liệu, v.v. nhưng tôi có một vài lý do để không làm điều đó.

  • Tôi sẽ ở trên một giải pháp lưu trữ, tôi có dung lượng lưu trữ rất lớn (10gb) nhưng chỉ có 300mb cho cơ sở dữ liệu. Nó sẽ tốn rất nhiều chi phí cho việc lưu trữ thêm trong DB.

  • Tôi không phải là chuyên gia về DB và cũng không kiểm soát các cài đặt của DB. Một giải pháp dựa trên DB có thể cần cấu hình tùy chỉnh như mong muốn.

Nếu chúng tôi sẽ chuyển sang chạy trang trên máy chủ của riêng mình, tôi có thể xem xét giải pháp dựa trên DB. cảm ơn, Stefan


1
Vui lòng chỉ định cơ sở dữ liệu bạn đang sử dụng.
Gerrie Schenck

1
Tôi dự định sử dụng MSSQL của phiên bản mới hơn.
StefanE

1
@StefanE, Hệ thống tập tin, với tất cả ý định và mục đích, là một cơ sở dữ liệu chuyên biệt được tối ưu hóa để lưu trữ tệp.
LukeH

Câu trả lời:


175

Lưu trữ hình ảnh trên hệ thống tập tin và vị trí hình ảnh trong cơ sở dữ liệu.

Tại sao? Bởi vì...

  1. Bạn sẽ có thể phục vụ các hình ảnh như các tập tin tĩnh.
  2. Không có quyền truy cập cơ sở dữ liệu hoặc mã ứng dụng sẽ được yêu cầu để lấy hình ảnh.
  3. Các hình ảnh có thể được phục vụ từ một máy chủ khác để cải thiện hiệu suất.
  4. Nó sẽ làm giảm tắc nghẽn cơ sở dữ liệu.
  5. Cơ sở dữ liệu cuối cùng lưu trữ dữ liệu của nó trên hệ thống tập tin.
  6. Hình ảnh có thể dễ dàng được lưu trữ khi lưu trữ trên hệ thống tập tin.

1
Ngoài ra, trong SQL Server khi bạn lưu trữ hình ảnh dưới dạng trường "Hình ảnh", đây thực sự là những gì SQL đang thực hiện - lưu trữ một con trỏ vào tệp trên đĩa ở đâu đó. Đây là cách nó đạt được giới hạn trang 8KB.
Zhaph - Ben Duguid

9
Điều này thực sự đã được giải quyết là SQL Server 2008. Đã có một loại mới được giới thiệu FILESTREAM technet.microsoft.com/en-us/l Library / bb895234.aspx cho phép tận dụng "hiệu suất của hệ thống tệp và đồng thời duy trì thống nhất giao dịch giữa dữ liệu phi cấu trúc và dữ liệu có cấu trúc tương ứng "
kristof

Yep bạn viết đúng. Câu hỏi của tôi là kích thước của blob là gì? hoặc nó có thể lưu trữ bao nhiêu bộ nhớ?
Ameer

11

Trong các dự án được phát triển gần đây của tôi, tôi đã lưu trữ hình ảnh (và tất cả các loại tài liệu nhị phân) dưới dạng cột hình ảnh trong các bảng cơ sở dữ liệu.

Ưu điểm của việc lưu trữ các tệp trong cơ sở dữ liệu rõ ràng là bạn không kết thúc với các tệp không được ước tính trên đĩa cứng nếu bản ghi bị xóa, vì đồng bộ hóa giữa cơ sở dữ liệu (= dữ liệu meta) và ổ cứng (= lưu trữ tệp) không được tích hợp và phải được lập trình bằng tay.

Sử dụng công nghệ ngày nay, tôi khuyên bạn nên lưu trữ hình ảnh trong các cột SQL Server 2008 FILESTREAM (ít nhất đó là những gì tôi sẽ làm với dự án tiếp theo của mình), vì chúng kết hợp lợi thế của việc lưu trữ dữ liệu trong cơ sở dữ liệu VÀ có các tệp nhị phân lớn trong các tệp riêng biệt (tại ít nhất theo quảng cáo;))


Bạn đã thử nghiệm chức năng Filestream chưa?
StefanE

1
Trên thực tế, khi xóa bản ghi DB, cũng có thể được mã hóa để xóa khỏi hệ thống tập tin. Vì vậy, tôi thấy thật tốt khi lưu trữ trong FS thay vì DB
kailash19

9

Câu ngạn ngữ luôn là "Tệp trong hệ thống tệp, siêu dữ liệu tệp trong cơ sở dữ liệu"


6

Tốt hơn để lưu trữ các tập tin như các tập tin. Các bảng dữ liệu khác nhau xử lý dữ liệu Blob khác nhau, vì vậy nếu bạn phải di chuyển phần cuối của mình, bạn có thể gặp rắc rối.

Khi phục vụ các tạp chí, <img src = cho một tệp đã tồn tại trên máy chủ có thể sẽ nhanh hơn việc tạo một tệp tạm thời từ trường cơ sở dữ liệu và trỏ thẻ <img vào đó.

Tôi đã tìm thấy câu trả lời này từ việc googling câu hỏi của bạn và đọc các bình luận tại http://database.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html


1
bài viết được giới thiệu có vẻ hơi lỗi thời.
devio

6

tôi thường thích có các tệp nhị phân trong cơ sở dữ liệu vì:

  • tính toàn vẹn dữ liệu: không có tệp không được ước tính, không có đường dẫn trong db mà không có tệp nào được liên kết
  • thống nhất dữ liệu: lấy một bãi chứa cơ sở dữ liệu và đó là tất cả. không "O tôi quên targz thư mục dữ liệu này."

4

Lưu trữ hình ảnh trong cơ sở dữ liệu sẽ thêm chi phí DB để phục vụ các hình ảnh đơn lẻ và khiến cho việc giảm tải lưu trữ thay thế (S3, Akami) trở nên khó khăn nếu bạn phát triển đến mức đó. Lưu trữ chúng trong cơ sở dữ liệu giúp việc di chuyển ứng dụng của bạn đến một máy chủ khác dễ dàng hơn nhiều vì đó chỉ là DB cần di chuyển ngay bây giờ.

Lưu trữ hình ảnh trên đĩa giúp dễ dàng giảm tải lưu trữ thay thế, làm cho các yếu tố tĩnh hình ảnh để bạn không phải loay hoay với các tiêu đề HTTP trong ứng dụng web của mình để làm cho hình ảnh có thể lưu vào bộ nhớ cache. Nhược điểm là nếu bạn từng di chuyển ứng dụng của mình sang một máy chủ khác, bạn cũng cần nhớ để di chuyển hình ảnh; một cái gì đó dễ dàng bị lãng quên.


3

Đối với các ứng dụng dựa trên web, bạn sẽ có được hiệu suất tốt hơn khi sử dụng hệ thống tệp để lưu trữ hình ảnh của mình. Làm như vậy sẽ cho phép bạn dễ dàng thực hiện bộ nhớ đệm của hình ảnh ở nhiều cấp độ trong ứng dụng của bạn. Có một số lợi thế để lưu trữ hình ảnh trong cơ sở dữ liệu, nhưng hầu hết thời gian những lợi thế đó đi kèm với các ứng dụng dựa trên máy khách.


0

Chỉ cần thêm một số chi tiết cho các câu trả lời đã tốt cho đến nay. Bạn vẫn có thể nhận được những lợi ích của bộ nhớ đệm từ cả cấp web có thể và mức độ cơ sở dữ liệu nếu bạn đi con đường giữ bạn hình ảnh trong cơ sở dữ liệu.

Tôi nghĩ đối với cơ sở dữ liệu bạn có thể đạt được điều này bằng cách bạn lưu trữ hình ảnh liên quan đến dữ liệu văn bản được liên kết với chúng và nếu bạn có thể truy cập vào hình ảnh vào một truy vấn cụ thể để cơ sở dữ liệu có thể lưu trữ truy vấn (chỉ là lý thuyết cảm thấy tự do để nuke tôi về phần đó).

Với phía web, tôi đoán là vì câu hỏi của bạn được gắn thẻ với asp.net rằng bạn sẽ đi theo con đường sử dụng trình xử lý http để phục vụ hình ảnh. Sau đó, bạn có tất cả các lợi ích của khung theo ý của bạn và bạn có thể giữ cho bạn sạch logic miền hơn mà chỉ cần chuyển khóa cho hình ảnh của bạn cho trình xử lý http.


-1

Tại sao không chọn một cơ sở dữ liệu NoSql riêng lẻ để lưu trữ các tệp của bạn.

Nó mang đến cho bạn tính toàn vẹn dữ liệu, tính nhất quán dữ liệu như @chburd đã đề cập.

Trong khi bạn rdbms vẫn giữ nhỏ.


-1
  1. Dưới đây là ví dụ từng bước (cách tiếp cận chung, triển khai Spring Eclipse) , về việc lưu trữ hình ảnh trong hệ thống tệp và giữ siêu dữ liệu của chúng trong DB - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Đây cũng là một ví dụ - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-mult Môn - files
  3. Ngoài ra, bạn có thể điều tra một cơ sở mã của dự án này - https://github.com/jdmr/fileUpload . Hãy chú ý đến bộ điều khiển này .
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.