2011-12-20 12 views
6

Chúng tôi đang thiết kế một ứng dụng .NET, lưu trữ và tìm kiếm một lượng lớn hình ảnh (> 100.000).Bạn nên sử dụng bộ lọc để lưu trữ hình ảnh và hình thu nhỏ?

Khi tải lên hình ảnh, chúng tôi cần tạo hình thu nhỏ và lưu hình ảnh gốc và hình thu nhỏ trong DB (SQL Server 2008 R2).

Tôi đã đọc rằng cách tốt nhất để lưu trữ hình ảnh được sử dụng FileStream

http://msdn.microsoft.com/en-us/library/cc949109.aspx

nhưng khi những hình ảnh có kích thước nhỏ này là ineficient.

Một ý tưởng hay là lưu trữ hình ảnh và hình thu nhỏ bằng cách sử dụng luồng phim? Có cách nào tốt hơn?

Trả lời

9

Có một bài báo thực sự hay do Microsoft Research gọi là To Blob or Not To Blob thảo luận sâu về chủ đề này.

Kết luận của họ sau khi một số lượng lớn các bài kiểm tra hiệu suất và phân tích là:

  • nếu hình ảnh hoặc tài liệu của bạn thường dưới 256K về kích thước, lưu trữ chúng trong một cơ sở dữ liệu VARBINARY cột là hiệu quả hơn

  • nếu hình ảnh hoặc tài liệu của bạn thường có dung lượng trên 1 MB, lưu trữ chúng trong hệ thống tệp hiệu quả hơn (và với thuộc tính FILESTREAM của SQL Server 2008, chúng vẫn đang được kiểm soát giao dịch và một phần của cơ sở dữ liệu)

  • ở giữa hai, đó là một chút của một toss-up tùy thuộc vào việc bạn sử dụng

Nếu bạn quyết định đưa hình ảnh của bạn vào một bảng SQL Server, tôi sẽ khuyên bạn sử dụng một bảng riêng biệt cho lưu trữ những hình ảnh đó - không lưu trữ foto của nhân viên trong bảng nhân viên - giữ chúng trong một bảng riêng biệt. Bằng cách đó, bảng Employee có thể ở mức gọn gàng và có ý nghĩa và rất hiệu quả, giả sử bạn không phải lúc nào cũng cần chọn nhân viên foto, như một phần của các truy vấn của bạn.

Đối với nhóm tệp, hãy xem Files and Filegroup Architecture để biết phần giới thiệu. Về cơ bản, bạn có thể tạo cơ sở dữ liệu của bạn với một nhóm tệp riêng biệt cho các cấu trúc dữ liệu lớn ngay từ đầu hoặc thêm một nhóm tệp bổ sung sau này. Hãy gọi nó là "LARGE_DATA".

Bây giờ, bất cứ khi nào bạn có một bảng mới để tạo ra mà cần phải lưu trữ VARCHAR(MAX) hoặc VARBINARY(MAX) cột, bạn có thể chỉ định nhóm tập tin này cho dữ liệu lớn:

CREATE TABLE dbo.YourTable 
    (....... define the fields here ......) 
    ON Data     -- the basic "Data" filegroup for the regular data 
    TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

Kiểm tra các giới thiệu MSDN trên filegroups, và chơi xung quanh với nó!

+0

Vâng, sự thật là trong TẤT CẢ truy vấn, chúng tôi cần chọn hình thu nhỏ HOẶC ảnh (hình thu nhỏ cho tìm kiếm kết quả và ảnh khi nhập để xem dữ liệu của hình ảnh). Trong trường hợp đó, chúng ta cũng phải tách biệt trong hai hàng? –

2

Thực ra, câu trả lời phù hợp - nó phụ thuộc. Nếu các hình ảnh tương đối nhỏ - bạn có thể giữ nó trong trường varbinary (max).

Tại sao không FILESTREAM? - Hiệu suất FILESTREAM đạt được tốt nhất trên các giá trị BLOB lớn - 1Mb +