Lưu trữ hình ảnh trong SQL Server?


191

Tôi đã tạo một trang web demo nhỏ và trên đó tôi đang lưu trữ hình ảnh trong một cột hình ảnh trên máy chủ sql. Một vài câu hỏi tôi có ...

  • Đây có phải là một ý tưởng tồi?

  • Nó sẽ ảnh hưởng đến hiệu suất trên trang web của tôi khi nó phát triển?

Cách khác là lưu trữ hình ảnh trên đĩa và chỉ lưu trữ tham chiếu đến hình ảnh trong cơ sở dữ liệu. Đây phải là một vấn đề nan giải phổ biến mà nhiều người đã có. Tôi hoan nghênh một số lời khuyên và thực sự sẽ rất vui khi giảm bớt sai lầm nếu tôi có thể.


5
Có sự bổ sung mới nào cho vấn đề này trong năm 2017 không? Điều này vẫn còn hiệu lực như ngày nay?
Haikal Nashuha

Câu trả lời:


270

Có một bài báo thực sự hay của Microsoft Research có tên To Blob hay Not To Blob .

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

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

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

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

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

Đối với các nhóm fileg, hãy xem Tập tin và Kiến trúc Filegroup để biết phần giới thiệu. Về cơ bản, bạn sẽ tạo cơ sở dữ liệu của mình với một nhóm tệp riêng 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. 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 cần lưu trữ các cột VARCHAR (MAX) hoặc VARBINARY (MAX), bạn có thể chỉ định nhóm tệp 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 phần giới thiệu MSDN trên các nhóm fileg và chơi xung quanh nó!


Đây là điều tốt hay xấu .... • nếu hình ảnh hoặc tài liệu của bạn thường có kích thước trên 1 MB, việc 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 nằm trong sự kiểm soát giao dịch và một phần của cơ sở dữ liệu)
htm11h

Câu trả lời chính xác. Nếu bạn cảm thấy như giải thích một cách chi tiết lý do tại sao bạn khuyên bạn nên sử dụng một bảng dành riêng cho dữ liệu hình ảnh, tôi đã tạo ra một câu hỏi riêng biệt cho rằng trên dba.SE .
Heinzi

15

Tôi đã rơi vào tình huống khó xử này một lần và nghiên cứu khá nhiều trên google để tìm ý kiến. Những gì tôi tìm thấy là thực sự nhiều người thấy việc lưu hình ảnh vào đĩa tốt hơn cho hình ảnh lớn hơn, trong khi myQuery cho phép truy cập dễ dàng hơn, đặc biệt là từ các ngôn ngữ như PHP.

Tôi tìm thấy một câu hỏi tương tự

MySQL BLOB vs File để lưu trữ hình ảnh PNG nhỏ?

Phán quyết cuối cùng của tôi là đối với những thứ như ảnh hồ sơ, chỉ cần một hình vuông nhỏ cần có ở mỗi người dùng, myQuery sẽ tốt hơn là lưu trữ một loạt các ngón tay cái trong hdd, trong khi đối với các album ảnh và những thứ tương tự, các thư mục / tập tin hình ảnh là tốt hơn.

Hy vọng nó giúp


14

Tôi muốn lưu trữ hình ảnh trong một thư mục, sau đó lưu trữ một tham chiếu đến tệp hình ảnh trong cơ sở dữ liệu.

Tuy nhiên, nếu bạn lưu trữ hình ảnh trong cơ sở dữ liệu, bạn nên phân vùng cơ sở dữ liệu của mình để cột hình ảnh nằm trong một tệp riêng biệt.

Bạn có thể đọc thêm về việc sử dụng các nhóm fileg tại đây http://msdn.microsoft.com/en-us/l Library / ms179316.aspx .


11

Tại sao có thể tốt để lưu trữ hình ảnh trong cơ sở dữ liệu mà không có trong một danh mục trên máy chủ web.

Bạn đã tạo một ứng dụng với rất nhiều hình ảnh được lưu trữ trong một thư mục trên máy chủ mà khách hàng đã sử dụng trong nhiều năm.

Bây giờ họ đến với bạn. Máy chủ của họ đã bị phá hủy và họ cần khôi phục nó trên một máy chủ mới. Họ không có quyền truy cập vào máy chủ cũ nữa. Sao lưu duy nhất họ có là sao lưu cơ sở dữ liệu.

Tất nhiên bạn có nguồn và có thể đơn giản triển khai nó đến máy chủ mới, cài đặt SqlServer và khôi phục cơ sở dữ liệu. Nhưng bây giờ tất cả các hình ảnh đã biến mất.

Nếu bạn đã lưu hình ảnh trong SqlServer, mọi thứ sẽ hoạt động như trước.

Chỉ cần 2 xu của tôi.


3
Điểm tốt. Sao lưu hình ảnh cũng quan trọng như sao lưu cơ sở dữ liệu ... đôi khi còn hơn thế.
Chris Catignani

Ngoài ra hình ảnh trên hệ thống tập tin cũng cần có sự cho phép của mạng.
Chris Catignani

2
Quyền mạng là một điểm tốt. Nhưng tôi không thấy trường hợp bạn chỉ có bản sao lưu DB. Bạn chắc chắn có một bản sao lưu của ứng dụng và tập tin. Bạn có thể dễ dàng mất DB nhưng có các tệp.
Norbert Norbertson



7

Mặc dù các vấn đề về hiệu suất là hợp lệ, nhưng lý do thực tế trong thực tế là bạn nên tránh lưu trữ hình ảnh trong cơ sở dữ liệu là vì lý do quản lý cơ sở dữ liệu. Cơ sở dữ liệu của bạn sẽ phát triển rất nhanh và cơ sở dữ liệu tốn kém hơn nhiều so với lưu trữ tệp đơn giản. Sao lưu cơ sở dữ liệu và khôi phục tốn kém và tốn thời gian hơn nhiều so với khôi phục sao lưu tệp. Trong một vài trường hợp, bạn có thể khôi phục một cơ sở dữ liệu nhỏ hơn nhanh hơn nhiều so với một hình ảnh đầy ắp. So sánh 1 TB lưu trữ tệp trên Azure với cơ sở dữ liệu 1 TB và bạn sẽ thấy sự khác biệt lớn về chi phí.


0

Theo kinh nghiệm của tôi, lưu trữ vào url đến các hình ảnh được lưu trữ ở một vị trí khác là cách tốt nhất cho một dự án đơn giản.

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.