Lưu trữ hình ảnh trong DB - Yea hoặc Nay?


415

Vì vậy, tôi đang sử dụng một ứng dụng lưu trữ hình ảnh rất nhiều trong DB. Quan điểm của bạn về điều này là gì? Tôi thuộc loại để lưu trữ vị trí trong hệ thống tệp hơn là lưu trữ trực tiếp trong DB.

Bạn nghĩ ưu / nhược điểm là gì?


Vâng, bạn có thể làm cả hai với bộ đệm đĩa giao dịch .
Sông Lilith

Câu trả lời:


350

Tôi phụ trách một số ứng dụng quản lý nhiều TB hình ảnh. Chúng tôi thấy rằng lưu trữ đường dẫn tệp trong cơ sở dữ liệu là tốt nhất.

Có một vài vấn đề:

  • lưu trữ cơ sở dữ liệu thường đắt hơn lưu trữ hệ thống tệp
  • bạn có thể tăng tốc truy cập hệ thống tệp với tiêu chuẩn tắt các sản phẩm trên kệ
    • ví dụ, nhiều máy chủ web sử dụng lệnh gọi hệ thống sendfile () của hệ điều hành để gửi một cách không đồng bộ tệp trực tiếp từ hệ thống tệp tới giao diện mạng. Hình ảnh được lưu trữ trong cơ sở dữ liệu không được hưởng lợi từ việc tối ưu hóa này.
  • những thứ như máy chủ web, v.v., không cần mã hóa hoặc xử lý đặc biệt để truy cập hình ảnh trong hệ thống tệp
  • cơ sở dữ liệu giành chiến thắng trong đó tính toàn vẹn giao dịch giữa hình ảnh và siêu dữ liệu là quan trọng.
    • Việc quản lý tính toàn vẹn giữa siêu dữ liệu db và dữ liệu hệ thống tệp sẽ phức tạp hơn
    • thật khó (trong ngữ cảnh của một ứng dụng web) để đảm bảo dữ liệu đã được xóa vào đĩa trên hệ thống tệp

33
những gì các sản phẩm kệ có sẵn cho "siêu tăng tốc" hệ thống tập tin?
Andrei Rînea

22
Trong khi tôi chỉ quản lý 3TB tệp, tôi hoàn toàn đồng ý. Cơ sở dữ liệu dành cho dữ liệu có cấu trúc, không phải các đốm màu.
derobert

7
@derobert: hoàn toàn như vậy, nếu bạn sẽ không bao giờ sử dụng một yếu tố dữ liệu trong truy vấn, như một điều kiện hoặc để tham gia, thì có lẽ nó không thuộc về cơ sở dữ liệu. Sau đó, một lần nữa, nếu bạn có một chức năng cơ sở dữ liệu đẹp để truy vấn hình ảnh cho phù hợp ...
Nils Weinander

14
những gì các sản phẩm kệ có sẵn cho "siêu tăng tốc" hệ thống tập tin?
ablmf

5
Re: sản phẩm "siêu tăng tốc": Hầu hết các máy chủ web hiện có thể tận dụng lệnh gọi hệ thống sendfile () để phân phối các tệp tĩnh không đồng bộ cho máy khách. Nó giảm tải cho hệ điều hành nhiệm vụ di chuyển tệp từ đĩa sang giao diện mạng. HĐH có thể thực hiện việc này hiệu quả hơn nhiều, hoạt động trong không gian kernel. Điều này, với tôi, có vẻ như là một chiến thắng lớn cho hệ thống tệp so với db để lưu trữ / phục vụ hình ảnh.
Alan Donnelly

140

Như với hầu hết các vấn đề, nó không đơn giản như nó có vẻ. Có những trường hợp sẽ có ý nghĩa để lưu trữ hình ảnh trong cơ sở dữ liệu.

  • Bạn đang lưu trữ hình ảnh đang thay đổi linh hoạt, giả sử hóa đơn và bạn muốn nhận hóa đơn như ngày 1 tháng 1 năm 2007?
  • Chính phủ muốn bạn duy trì 6 năm lịch sử
  • Hình ảnh được lưu trữ trong cơ sở dữ liệu không yêu cầu một chiến lược sao lưu khác. Hình ảnh được lưu trữ trên hệ thống tập tin làm
  • Việc kiểm soát truy cập vào hình ảnh sẽ dễ dàng hơn nếu chúng nằm trong cơ sở dữ liệu. Quản trị viên nhàn rỗi có thể truy cập bất kỳ thư mục trên đĩa. Phải mất một quản trị viên thực sự quyết tâm để rình mò trong cơ sở dữ liệu để trích xuất hình ảnh

Mặt khác, có những vấn đề liên quan

  • Yêu cầu mã bổ sung để trích xuất và truyền phát hình ảnh
  • Độ trễ có thể chậm hơn truy cập tệp trực tiếp
  • Tải nặng hơn trên máy chủ cơ sở dữ liệu

2
Không có chiến lược sao lưu riêng biệt có thể là một vấn đề lớn khi bạn viết các ứng dụng được cài đặt trên tiền đề (như SharePoint). Khi bạn tạo bản sao lưu SharePoint, mọi thứ đều nằm trong DB, điều này làm cho nó rất dễ dàng.
Eric Schoonover

44
Bảo mật bằng cách che khuất không thực sự là một chiến lược kiểm soát truy cập!
Jon Lồng

5
Tôi không nghĩ anh ấy ủng hộ an ninh bằng cách che khuất - anh ấy nói rằng việc đưa hình ảnh vào DB thêm một lớp bảo mật khác. (Tôi nghĩ rằng ... @Conrad, đừng muốn đặt từ ngữ vào miệng bạn)
AJ.

Tôi đã chọn lưu trữ hình ảnh trong cơ sở dữ liệu vì lợi thế sao lưu duy nhất (hay nói chung hơn là có tất cả dữ liệu ở một nơi), nhưng các vấn đề bạn đề cập cũng đúng, đó là lý do tại sao tôi lưu trữ hình ảnh trên hệ thống tệp. Đó là điều tốt nhất của cả hai thế giới, và tôi ngạc nhiên không có câu trả lời hàng đầu nào ở đây đề cập đến nó.
Bart van Heukelom

Bạn có tình cờ sử dụng thư viện ImageResizing.Net để xử lý bộ đệm ẩn hình ảnh SQL-> của bạn không? Đó là bộ đệm đĩa mạnh mẽ, có thể mở rộng và mạnh mẽ nhất mà bạn có thể nhận được ...
Lilith River


56

Đây có thể là một chút khó khăn, nhưng nếu bạn đang sử dụng (hoặc dự định sử dụng) SQL Server 2008, tôi khuyên bạn nên xem loại dữ liệu FileStream mới .

FileStream giải quyết hầu hết các vấn đề xung quanh việc lưu trữ các tệp trong DB:

  1. Các Blobs thực sự được lưu trữ dưới dạng các tệp trong một thư mục.
  2. Các Blobs có thể được truy xuất thông qua một trong hai kết nối cơ sở dữ liệu hoặc trên hệ thống tập tin.
  3. Sao lưu được tích hợp.
  4. Di chuyển "chỉ hoạt động".

Tuy nhiên, "Mã hóa dữ liệu trong suốt" của SQL không mã hóa các đối tượng FileStream, vì vậy nếu đó là một sự cân nhắc, bạn có thể tốt hơn là chỉ lưu trữ chúng dưới dạng varbinary.

Từ bài viết MSDN:

Các câu lệnh Transact-SQL có thể chèn, cập nhật, truy vấn, tìm kiếm và sao lưu dữ liệu FILESTREAM. Giao diện hệ thống tệp Win32 cung cấp quyền truy cập trực tuyến vào dữ liệu.
FILESTREAM sử dụng bộ đệm hệ thống NT để lưu trữ dữ liệu tệp. Điều này giúp giảm bất kỳ ảnh hưởng nào mà dữ liệu FILESTREAM có thể có đối với hiệu suất của Engine Engine. Nhóm bộ đệm SQL Server không được sử dụng; do đó, bộ nhớ này có sẵn để xử lý truy vấn.


+1 cho FileStream. Nó thực sự lưu trữ các đốm màu dưới dạng tệp trên đĩa, nhưng quản lý chúng một cách giao dịch.
John Gietzen

Ngoài ra, máy chủ SQL cho phép các đốm màu FileStream được truy cập trực tiếp từ đĩa, do đó bạn có thể tránh việc kết nối DB
John Gietzen

Tuy nhiên, độ trễ được thêm vào giữa DB và máy chủ web ... Và máy chủ web sẽ phải tải nó vào bộ nhớ để truyền phát nó đến máy khách thay vì có thể truyền phát nó từ đĩa, trừ khi bạn đang sử dụng bộ nhớ đệm đĩa.
Sông Lilith

39

Đường dẫn tệp trong DB chắc chắn là con đường để đi - Tôi đã nghe câu chuyện từ những khách hàng bị TB hình ảnh rằng nó trở thành một cơn ác mộng khi cố gắng lưu trữ bất kỳ số lượng hình ảnh đáng kể nào trong DB - chỉ riêng hiệu suất đạt được là quá nhiều.


35

Theo kinh nghiệm của tôi, đôi khi giải pháp đơn giản nhất là đặt tên cho hình ảnh theo khóa chính . Vì vậy, thật dễ dàng để tìm thấy hình ảnh thuộc về một bản ghi cụ thể và ngược lại. Nhưng đồng thời bạn không lưu trữ bất cứ điều gì về hình ảnh trong cơ sở dữ liệu.


Thực sự rất tốt đẹp. Người dùng của bạn giờ đây có thể dễ dàng tăng tên tệp của bạn để truy cập các tệp khác ...
Marijn Huizendveld

6
@Marijn: Điều đó chỉ khi bạn phơi bày những hình ảnh ra thế giới.
Seun Osewa

Chúng tôi đã làm một cái gì đó rất giống với các tài liệu hình ảnh của chúng tôi (khóa chính của chúng tôi là khóa tổng hợp gồm ba mục.), Nhưng chúng tôi đã thêm ngày và thời gian tài liệu được quét để chúng tôi có thể có nhiều phiên bản trong cùng một thư mục.
Andrew Neely

@Osewa, thế nào? Có, để truy cập trực tiếp vào tệp, người dùng cuối sẽ cần quyền truy cập vào thư mục. Bạn có thể có một quy trình để phục vụ tệp qua FTP dựa trên yêu cầu và bảo mật sẽ ngang bằng với máy chủ SQL.
Andrew Neely

31

Bí quyết ở đây là không trở thành một người nhiệt tâm.

Một điều cần lưu ý ở đây là không ai trong trại hệ thống tệp pro đã liệt kê một hệ thống tệp cụ thể. Điều này có nghĩa là tất cả mọi thứ từ FAT16 đến ZFS đều đánh bại mọi cơ sở dữ liệu?

Không.

Sự thật là nhiều cơ sở dữ liệu đánh bại nhiều hệ thống tệp, ngay cả khi chúng ta chỉ nói về tốc độ thô.

Quá trình hành động chính xác là đưa ra quyết định đúng đắn cho kịch bản chính xác của bạn và để làm điều đó, bạn sẽ cần một số con số và một số ước tính ca sử dụng.


6
Tôi không thấy ai tuyên bố rằng hệ thống tập tin nhanh hơn DB 100% thời gian (đọc câu trả lời của Mark Harrison). Đó là một chút của một người rơm. Có thể có những tình huống không nên thắt dây an toàn, nhưng nói chung , đeo dây an toàn là một ý tưởng tốt.
Calvin

30

Ở những nơi bạn PHẢI đảm bảo tính toàn vẹn tham chiếu và tuân thủ ACID, việc lưu trữ hình ảnh trong cơ sở dữ liệu là bắt buộc.

Bạn không thể giao dịch đảm bảo rằng hình ảnh và siêu dữ liệu về hình ảnh đó được lưu trữ trong cơ sở dữ liệu tham chiếu đến cùng một tệp. Nói cách khác, không thể đảm bảo rằng tệp trên hệ thống tệp chỉ bị thay đổi cùng một lúc và trong cùng một giao dịch với siêu dữ liệu.


7
Trên thực tế, không, bạn có thể. Miễn là các tệp hình ảnh không bao giờ bị xóa, thay đổi hoặc ghi đè một lần, tất cả các tệp hình ảnh được đồng bộ hóa trước khi thực hiện giao dịch, không có lỗi hệ thống tệp, bạn có thể chắc chắn rằng các tệp hình ảnh và siêu dữ liệu được đồng bộ hóa. Đối với một số ứng dụng, đó là quá nhiều if, tôi đoán vậy.
Seun Osewa

Tôi sẽ còn đi xa hơn và nói rằng với một hệ thống tệp Nhật ký và một số logic chương trình bổ sung, có thể đạt được sự tuân thủ ACID. Các bước sẽ là ghi bản ghi db, ghi tệp. Nếu tệp cam kết, cam kết giao dịch db.
Andrew Neely

28

Như những người khác đã nói SQL 2008 đi kèm với loại Filestream cho phép bạn lưu tên tệp hoặc mã định danh dưới dạng con trỏ trong db và tự động lưu trữ hình ảnh trên hệ thống tệp của bạn, đây là một tình huống tuyệt vời.

Nếu bạn đang sử dụng cơ sở dữ liệu cũ hơn, thì tôi sẽ nói rằng nếu bạn lưu trữ dữ liệu đó dưới dạng dữ liệu blob, thì bạn thực sự sẽ không lấy bất cứ thứ gì ra khỏi cơ sở dữ liệu theo cách tìm kiếm các tính năng, vì vậy có lẽ tốt nhất để lưu trữ một địa chỉ trên một hệ thống tập tin và lưu trữ hình ảnh theo cách đó.

Bằng cách đó, bạn cũng tiết kiệm không gian trên hệ thống tệp của mình, vì bạn sẽ chỉ tiết kiệm được dung lượng chính xác hoặc thậm chí không gian được nén trên hệ thống tệp.

Ngoài ra, bạn có thể quyết định lưu với một số cấu trúc hoặc thành phần cho phép bạn duyệt các hình ảnh thô trong hệ thống tệp của mình mà không có bất kỳ lần truy cập db nào hoặc chuyển các tệp hàng loạt sang hệ thống khác, ổ cứng, S3 hoặc một kịch bản khác - cập nhật vị trí trong chương trình của bạn, nhưng giữ cấu trúc, một lần nữa mà không có nhiều điểm nhấn khi cố gắng đưa hình ảnh ra khỏi db của bạn khi cố gắng tăng dung lượng.

Có lẽ, nó cũng sẽ cho phép bạn ném một số yếu tố bộ nhớ đệm, dựa trên các url hình ảnh thường gặp vào công cụ / chương trình web của bạn, vì vậy bạn cũng đang tự cứu mình ở đó.


27

Các hình ảnh tĩnh nhỏ (không quá vài megs) không được chỉnh sửa thường xuyên, nên được lưu trữ trong cơ sở dữ liệu. Phương pháp này có một số lợi ích bao gồm tính di động dễ dàng hơn (hình ảnh được truyền cùng với cơ sở dữ liệu), sao lưu / khôi phục dễ dàng hơn (hình ảnh được sao lưu với cơ sở dữ liệu) và khả năng mở rộng tốt hơn (một thư mục hệ thống tệp có hàng ngàn tệp thu nhỏ nghe có vẻ như một cơn ác mộng về khả năng mở rộng tôi).

Việc phục vụ hình ảnh từ cơ sở dữ liệu rất dễ dàng, chỉ cần thực hiện trình xử lý http phục vụ mảng byte được trả về từ máy chủ DB dưới dạng luồng nhị phân.


Tôi sẽ lập luận rằng cơ sở dữ liệu tốt hơn cho các tệp thường xuyên được chỉnh sửa, vì tính nhất quán có thể là một vấn đề trong trường hợp đó.
Seun Osewa

26

Đây là một tờ giấy trắng thú vị về chủ đề này.

Để BLOB hoặc không tới BLOB: Lưu trữ đối tượng lớn trong cơ sở dữ liệu hoặc hệ thống tệp

Câu trả lơi con phụ thuộc vao nhiêu thư." Chắc chắn nó sẽ phụ thuộc vào máy chủ cơ sở dữ liệu và cách tiếp cận của nó để lưu trữ blob. Nó cũng phụ thuộc vào loại dữ liệu được lưu trữ trong các đốm màu, cũng như cách dữ liệu đó được truy cập.

Các tệp có kích thước nhỏ hơn có thể được lưu trữ và phân phối một cách hiệu quả bằng cách sử dụng cơ sở dữ liệu làm cơ chế lưu trữ. Các tệp lớn hơn có thể sẽ được lưu trữ tốt nhất bằng hệ thống tệp, đặc biệt là nếu chúng sẽ được sửa đổi / cập nhật thường xuyên. (phân mảnh blob trở thành một vấn đề liên quan đến hiệu suất.)

Đây là một điểm bổ sung cần ghi nhớ. Một trong những lý do hỗ trợ việc sử dụng cơ sở dữ liệu để lưu trữ các đốm màu là tuân thủ ACID. Tuy nhiên, cách tiếp cận mà người kiểm tra đã sử dụng trong sách trắng, (tùy chọn Nhật ký hàng loạt của SQL Server,) đã nhân đôi thông lượng của SQL Server, đã thay đổi hiệu quả 'D' trong ACID thành 'd,' vì dữ liệu blob không được ghi lại với viết ban đầu cho giao dịch. Do đó, nếu tuân thủ ACID đầy đủ là một yêu cầu quan trọng đối với hệ thống của bạn, hãy giảm một nửa số liệu thông lượng của Máy chủ SQL để ghi cơ sở dữ liệu khi so sánh I / O của tệp với I / O của cơ sở dữ liệu.


25

Một điều mà tôi chưa thấy ai đề cập đến nhưng chắc chắn đáng chú ý là có những vấn đề liên quan đến việc lưu trữ một lượng lớn hình ảnh trong hầu hết các hệ thống tập tin. Ví dụ: nếu bạn sử dụng cách tiếp cận được đề cập ở trên và đặt tên cho từng tệp hình ảnh theo khóa chính, trên hầu hết các hệ thống tệp, bạn sẽ gặp vấn đề nếu bạn cố gắng đặt tất cả các hình ảnh vào một thư mục lớn khi bạn đạt được số lượng hình ảnh rất lớn ( ví dụ trong hàng trăm ngàn hoặc hàng triệu).

Một khi giải pháp chung cho việc này là băm chúng thành một cây thư mục con cân bằng.


Bạn sẽ nghĩ như vậy, nhưng các vấn đề thực sự là nhỏ; Tôi có một ứng dụng với hàng triệu tệp trong một thư mục, được hàng trăm người dùng truy cập mà không gặp vấn đề gì. Nó không thông minh, nhưng nó hoạt động. Vấn đề lớn nhất là nếu bạn sử dụng Explorer để duyệt thư mục, bạn sẽ xem đèn pin mãi mãi.
SqlACID

1
Tốt hơn là sử dụng một hệ thống tệp không có vấn đề với các thư mục lớn
Seun Osewa

8
Tôi đã có một ứng dụng với hàng triệu tệp trong một thư mục (máy chủ đang chạy RHEL 4) - để liệt kê các nội dung thư mục (đường ống đến một tệp) mất nhiều ngày và tạo ra một tệp đầu ra có kích thước 100 MB. Bây giờ họ đang ở trong một cơ sở dữ liệu Tôi có một tệp duy nhất mà tôi có thể di chuyển hoặc sao lưu khá dễ dàng.
Richard

1
@Seun Osewa: mọi hệ thống tệp đều có giới hạn ... và nếu bạn biết một hệ thống không có vấn đề gì khi lưu trữ hàng triệu mục trong cùng một thư mục, vui lòng cho tôi biết!
Guillaume

1
@Seun Osewa: cơ sở dữ liệu hiện có tối đa 28 GB, với 5,4 M hồ sơ. Cuối cùng tôi đã phải phân vùng bảng cơ sở dữ liệu để tôi có một số tệp để sao lưu có kích thước khoảng 5GB. Bây giờ tôi đã lưu các hình ảnh riêng lẻ lên Amazon S3 để tôi chỉ phải lưu tên tệp trong DB (và Amazon có thể thực hiện sao lưu )
Richard

22

Một cái gì đó không ai đã đề cập là DB đảm bảo các hành động nguyên tử, tính toàn vẹn giao dịch và giao dịch đồng thời. Ngay cả tính toàn vẹn tham chiếu cũng nằm ngoài cửa sổ với một hệ thống tệp - vậy làm thế nào để bạn biết tên tệp của mình thực sự vẫn đúng?

Nếu bạn có hình ảnh của mình trong một hệ thống tệp và ai đó đang đọc tệp khi bạn đang viết một phiên bản mới hoặc thậm chí xóa tệp - điều gì xảy ra?

Chúng tôi sử dụng các đốm màu vì chúng cũng dễ quản lý hơn (sao lưu, sao chép, chuyển giao). Họ làm việc tốt cho chúng tôi.


Khả năng có hai bản cập nhật đồng thời cho một hình ảnh cụ thể là gì?
Arafangion

1
bạn không cần cập nhật đồng thời để có vấn đề - đó có thể là đọc và viết. Trong trường hợp của chúng tôi điều này gần như được đảm bảo để xảy ra.
Draemon

20

Vấn đề với việc chỉ lưu trữ các filepath vào hình ảnh trong cơ sở dữ liệu là tính toàn vẹn của cơ sở dữ liệu không còn có thể bị ép buộc.

Nếu hình ảnh thực tế được chỉ ra bởi filepath không có sẵn, cơ sở dữ liệu vô tình có lỗi toàn vẹn.

Cho rằng hình ảnh là dữ liệu thực tế đang được tìm kiếm và chúng có thể được quản lý dễ dàng hơn (hình ảnh sẽ không biến mất đột ngột) trong một cơ sở dữ liệu tích hợp thay vì phải giao tiếp với một loại hệ thống tệp (nếu hệ thống tệp được truy cập độc lập, hình ảnh MIGHT đột nhiên "biến mất"), tôi sẽ lưu trữ chúng trực tiếp dưới dạng BLOB hoặc tương tự.


17

Tại một công ty nơi tôi từng làm việc, chúng tôi đã lưu trữ 155 triệu hình ảnh trong cơ sở dữ liệu Oracle 8i (sau đó là 9i). Giá trị 7,5TB.


5
Chắc chắn rồi. Rõ ràng cơ sở dữ liệu bây giờ lớn hơn rất nhiều. Có dữ liệu trong cơ sở dữ liệu có nghĩa là sao chép cơ sở dữ liệu tại các trang web khác nhau cũng dễ dàng hơn rất nhiều.
graham.reeds

Tôi đã thấy một cuộc biểu tình của Oracle nơi mà thực sự có thể gắn một hệ thống tệp vào cơ sở dữ liệu, hoặc một cái gì đó tương tự. Bạn có biết nếu đây là những gì bạn đã làm? (Xin lỗi, tôi không biết gì về Oracle nên có lẽ tôi đang nói chuyện rác rưởi.)
Stu Thompson

Tôi không nghĩ vậy - nó đã lưu trữ hình ảnh trong cơ sở dữ liệu dưới dạng cơ sở dữ liệu. Cơ sở dữ liệu được điều chỉnh mạnh mẽ - Tôi nhớ nhiều cuộc thảo luận về kích thước của hình ảnh thay đổi khi các trường được thêm và xóa. Tất cả mọi thứ đã được liên kết ranh giới.
graham.reeds

14

Thông thường, tôi không muốn sử dụng phần đắt nhất và khó nhất để mở rộng phần cơ sở hạ tầng của bạn (cơ sở dữ liệu) và đặt tất cả tải vào đó. Mặt khác: Nó đơn giản hóa rất nhiều chiến lược sao lưu, đặc biệt là khi bạn có nhiều máy chủ web và cần bằng cách nào đó giữ cho dữ liệu được đồng bộ hóa.

Giống như hầu hết những thứ khác, Nó phụ thuộc vào quy mô và Ngân sách dự kiến.


13

Chúng tôi đã triển khai một hệ thống hình ảnh tài liệu lưu trữ tất cả hình ảnh của nó trong các trường blob SQL2005. Có vài trăm GB tại thời điểm này và chúng tôi đang thấy thời gian phản hồi tuyệt vời và ít hoặc không có sự suy giảm hiệu suất. Ngoài ra, theo quy định pháp lý, chúng tôi có một lớp phần mềm trung gian lưu trữ các tài liệu mới được đăng lên một hệ thống máy hát tự động quang hiển thị chúng như một hệ thống tệp NTFS tiêu chuẩn.

Chúng tôi rất hài lòng với kết quả, đặc biệt là:

  1. Dễ sao chép và sao lưu
  2. Khả năng dễ dàng thực hiện một hệ thống phiên bản tài liệu

11

Nếu đây là ứng dụng dựa trên web thì có thể có những lợi thế khi lưu trữ hình ảnh trên mạng phân phối lưu trữ của bên thứ ba, chẳng hạn như nền tảng S3 của Amazon hoặc nền tảng Nirvanix.


11

Giả định: Ứng dụng được bật web / dựa trên web

Tôi ngạc nhiên không ai thực sự đề cập đến điều này ... ủy thác nó cho những người khác là chuyên gia -> sử dụng nhà cung cấp dịch vụ lưu trữ hình ảnh / tệp của bên thứ 3 .

Lưu trữ tệp của bạn trên một dịch vụ trực tuyến phải trả tiền như

Một chủ đề StackOverflow khác nói về điều này ở đây .

Chủ đề này giải thích lý do tại sao bạn nên sử dụng nhà cung cấp dịch vụ lưu trữ bên thứ 3.

Thật đáng giá. Họ lưu trữ nó một cách hiệu quả. Không có băng thông nào được tải lên từ máy chủ của bạn tới các yêu cầu của khách hàng, v.v.


10

Nếu bạn không sử dụng SQL Server 2008 và bạn có một số lý do chắc chắn để đưa các tệp hình ảnh cụ thể vào cơ sở dữ liệu, thì bạn có thể sử dụng phương pháp "cả hai" và sử dụng hệ thống tệp làm bộ đệm tạm thời và sử dụng cơ sở dữ liệu làm kho lưu trữ chính .

Ví dụ: logic nghiệp vụ của bạn có thể kiểm tra xem một tệp hình ảnh có tồn tại trên đĩa hay không trước khi phục vụ nó, lấy ra từ cơ sở dữ liệu khi cần thiết. Điều này mua cho bạn khả năng của nhiều máy chủ web và ít sự cố đồng bộ hóa hơn.


+1 Điều này cũng cho phép bạn lưu trữ hình ảnh gốc, cung cấp phiên bản được lưu trong bộ nhớ cache / tối ưu hóa trong khi cho phép thay đổi kích thước / nén sau
Deebster

7

Tôi không chắc có bao nhiêu ví dụ về "thế giới thực" này, nhưng hiện tại tôi có một ứng dụng lưu trữ thông tin chi tiết cho một trò chơi thẻ giao dịch, bao gồm cả hình ảnh cho các thẻ. Cho đến nay, số lượng bản ghi cho cơ sở dữ liệu chỉ là 2851 bản ghi, nhưng thực tế là một số thẻ đã được phát hành nhiều lần và có tác phẩm nghệ thuật thay thế, thực sự hiệu quả hơn là quét "hình vuông chính" của tác phẩm nghệ thuật và sau đó tự động tạo đường viền và hiệu ứng linh tinh cho thẻ khi được yêu cầu.

Người tạo ban đầu của thư viện hình ảnh này đã tạo ra một lớp truy cập dữ liệu kết xuất hình ảnh dựa trên yêu cầu và nó thực hiện khá nhanh để xem và từng thẻ riêng lẻ.

Điều này cũng giúp giảm bớt việc triển khai / cập nhật khi thẻ mới được phát hành, thay vì nén toàn bộ thư mục hình ảnh và gửi chúng xuống đường ống và đảm bảo cấu trúc thư mục phù hợp được tạo, tôi chỉ cần cập nhật cơ sở dữ liệu và yêu cầu người dùng tải xuống lại. Điều này hiện có kích thước lên tới 56MB, không phải là tuyệt vời, nhưng tôi đang làm việc trên một tính năng cập nhật gia tăng cho các bản phát hành trong tương lai. Ngoài ra, có một phiên bản "không có hình ảnh" của ứng dụng cho phép những người qua quay số có được ứng dụng mà không bị trì hoãn tải xuống.

Giải pháp này đã hoạt động rất tốt cho đến nay vì bản thân ứng dụng được nhắm mục tiêu như một phiên bản duy nhất trên máy tính để bàn. Có một trang web nơi tất cả các dữ liệu này được lưu trữ để truy cập trực tuyến, nhưng tôi sẽ không sử dụng cùng một giải pháp cho việc này. Tôi đồng ý truy cập tệp sẽ thích hợp hơn vì nó sẽ mở rộng tốt hơn theo tần suất và khối lượng yêu cầu được thực hiện cho hình ảnh.

Hy vọng rằng điều này không quá lảm nhảm, nhưng tôi đã thấy chủ đề này và muốn cung cấp một số hiểu biết của tôi về một ứng dụng quy mô nhỏ / vừa tương đối thành công.


Khi xử lý sao chép, lưu trữ hình ảnh trong cơ sở dữ liệu là IMO vượt trội hơn nhiều.
bíp


7

Nó phụ thuộc vào số lượng hình ảnh bạn sẽ lưu trữ và kích thước của chúng. Tôi đã sử dụng cơ sở dữ liệu để lưu trữ hình ảnh trong quá khứ và kinh nghiệm của tôi khá tốt.

IMO, Ưu điểm của việc sử dụng cơ sở dữ liệu để lưu trữ hình ảnh là,

A. Bạn không cần cấu trúc FS để giữ hình ảnh của mình
B. Chỉ mục cơ sở dữ liệu hoạt động tốt hơn cây FS khi số lượng mục được lưu trữ nhiều hơn
C. Cơ sở dữ liệu được điều chỉnh thông minh thực hiện công việc tốt khi lưu kết quả truy vấn
D. Sao lưu đơn giản. Nó cũng hoạt động tốt nếu bạn đã thiết lập sao chép và nội dung được gửi từ một máy chủ gần người dùng. Trong những trường hợp như vậy, không cần đồng bộ hóa rõ ràng.

Nếu hình ảnh của bạn sẽ nhỏ (giả sử <64k) và công cụ lưu trữ của db của bạn hỗ trợ BLOB nội tuyến (trong bản ghi), nó sẽ cải thiện hiệu suất hơn nữa vì không cần phải có hướng dẫn (Địa phương tham chiếu).

Lưu trữ hình ảnh có thể là một ý tưởng tồi khi bạn đang xử lý một số lượng nhỏ hình ảnh có kích thước khổng lồ. Một vấn đề khác với việc lưu trữ hình ảnh trong db là, siêu dữ liệu như tạo, ngày sửa đổi phải được xử lý bởi ứng dụng của bạn.


7

Gần đây tôi đã tạo một ứng dụng PHP / MySQL lưu trữ các tệp PDF / Word trong bảng MySQL (lớn tới 40 MB cho mỗi tệp cho đến nay).

Ưu điểm:

  • Các tệp đã tải lên được sao chép vào máy chủ sao lưu cùng với mọi thứ khác, không cần chiến lược sao lưu riêng biệt (yên tâm).
  • Việc thiết lập máy chủ web đơn giản hơn một chút vì tôi không cần phải có thư mục tải lên / và cho tất cả các ứng dụng của mình biết nó đang ở đâu.
  • Tôi có thể sử dụng các giao dịch cho các chỉnh sửa để cải thiện tính toàn vẹn dữ liệu - Tôi không phải lo lắng về các tệp bị mồ côi và bị thiếu

Nhược điểm:

  • mysqldump hiện mất một thời gian ngắn vì có 500MB dữ liệu tệp trong một trong các bảng.
  • Nhìn chung, bộ nhớ / cpu không hiệu quả lắm khi so sánh với hệ thống tập tin

Tôi gọi việc thực hiện của tôi là thành công, nó quan tâm đến các yêu cầu sao lưu và đơn giản hóa bố cục của dự án. Hiệu suất là tốt cho 20-30 người sử dụng ứng dụng.


6

Theo kinh nghiệm của tôi, tôi đã phải quản lý cả hai tình huống: hình ảnh được lưu trữ trong cơ sở dữ liệu và hình ảnh trên hệ thống tệp với đường dẫn được lưu trữ trong db.

Giải pháp đầu tiên, hình ảnh trong cơ sở dữ liệu, có phần "sạch" hơn vì lớp truy cập dữ liệu của bạn sẽ chỉ phải xử lý các đối tượng cơ sở dữ liệu; nhưng điều này chỉ tốt khi bạn phải đối phó với số lượng thấp.

Rõ ràng hiệu suất truy cập cơ sở dữ liệu khi bạn xử lý các đối tượng lớn nhị phân đang xuống cấp và kích thước cơ sở dữ liệu sẽ tăng lên rất nhiều, gây mất hiệu suất một lần nữa ... và thông thường không gian cơ sở dữ liệu đắt hơn nhiều so với không gian hệ thống tệp.

Mặt khác, việc có các đối tượng nhị phân lớn được lưu trữ trong hệ thống tệp sẽ khiến bạn có các gói sao lưu phải xem xét cả cơ sở dữ liệu và hệ thống tệp và đây có thể là một vấn đề đối với một số hệ thống.

Một lý do khác để sử dụng hệ thống tệp là khi bạn phải chia sẻ dữ liệu hình ảnh của mình (hoặc âm thanh, video, bất cứ thứ gì) với quyền truy cập của bên thứ ba: trong thời đại này, tôi đang phát triển một ứng dụng web sử dụng hình ảnh phải được truy cập từ "bên ngoài "Trang trại web của tôi theo cách mà cơ sở dữ liệu truy cập để lấy dữ liệu nhị phân đơn giản là không thể. Vì vậy, đôi khi cũng có những cân nhắc thiết kế sẽ đưa bạn đến một sự lựa chọn.

Cũng xem xét, khi đưa ra lựa chọn này, nếu bạn phải đối phó với sự cho phép và xác thực khi truy cập các đối tượng nhị phân: những điều cần thiết này thường có thể được giải quyết theo cách dễ dàng hơn khi dữ liệu được lưu trữ trong db.


4

Tôi đã từng làm việc trên một ứng dụng xử lý hình ảnh. Chúng tôi đã lưu trữ các hình ảnh được tải lên trong một thư mục giống như / hình ảnh / [ngày hôm nay] / [số id]. Nhưng chúng tôi cũng trích xuất siêu dữ liệu (dữ liệu exif) từ hình ảnh và lưu trữ trong cơ sở dữ liệu, cùng với dấu thời gian và như vậy.


4

Trong một dự án trước đây, tôi đã lưu trữ hình ảnh trên hệ thống tập tin và điều đó gây ra rất nhiều vấn đề đau đầu với các bản sao lưu, sao chép và hệ thống tập tin không đồng bộ với cơ sở dữ liệu.

Trong dự án mới nhất của tôi, tôi đang lưu trữ hình ảnh trong cơ sở dữ liệu và lưu trữ chúng trên hệ thống tập tin và nó hoạt động rất tốt. Tôi đã không có vấn đề cho đến nay.


3

Thứ hai khuyến nghị về đường dẫn tập tin. Tôi đã làm việc với một vài dự án cần thiết để quản lý các bộ sưu tập tài sản lớn và bất kỳ nỗ lực nào để lưu trữ mọi thứ trực tiếp trong DB đều dẫn đến đau đớn và thất vọng về lâu dài.

"Pro" thực sự duy nhất tôi có thể nghĩ đến về việc lưu trữ chúng trong DB là khả năng dễ dàng cho các tài sản hình ảnh riêng lẻ. Nếu không có đường dẫn tệp nào để sử dụng và tất cả các hình ảnh được truyền thẳng ra khỏi DB, sẽ không có nguy cơ người dùng tìm thấy các tệp mà họ không nên truy cập.

Điều đó có vẻ như sẽ được giải quyết tốt hơn với một tập lệnh trung gian lấy dữ liệu từ kho lưu trữ tệp không thể truy cập web. Vì vậy, bộ lưu trữ DB không thực sự cần thiết.


3

Từ trên đường phố là trừ khi bạn là nhà cung cấp cơ sở dữ liệu cố gắng chứng minh rằng cơ sở dữ liệu của bạn có thể làm điều đó (như giả sử Microsoft khoe khoang về Terraserver lưu trữ một hình ảnh bajillion trong SQL Server) thì đó không phải là ý kiến ​​hay. Khi thay thế - lưu trữ hình ảnh trên máy chủ tệp và đường dẫn trong cơ sở dữ liệu dễ dàng hơn nhiều, tại sao phải bận tâm? Các lĩnh vực Blob giống như khả năng off-road của SUV - hầu hết mọi người không sử dụng chúng, những người thường gặp rắc rối, và sau đó có những người làm, nhưng chỉ vì niềm vui của nó.


3

Lưu trữ một hình ảnh trong cơ sở dữ liệu vẫn có nghĩa là dữ liệu hình ảnh kết thúc ở đâu đó trong hệ thống tệp nhưng bị che khuất để bạn không thể truy cập trực tiếp vào nó.

+ ves:

  • toàn vẹn cơ sở dữ liệu
  • Thật dễ dàng để quản lý vì bạn không phải lo lắng về việc giữ cho hệ thống tệp được đồng bộ hóa khi hình ảnh được thêm hoặc xóa

-ves:

  • hiệu suất hình phạt - tra cứu cơ sở dữ liệu thường chậm hơn khi tra cứu hệ thống tập tin
  • bạn không thể chỉnh sửa hình ảnh trực tiếp (cắt, thay đổi kích thước)

Cả hai phương pháp đều phổ biến và được thực hành. Có một cái nhìn về những lợi thế và bất lợi. Dù bằng cách nào, bạn sẽ phải suy nghĩ về cách khắc phục nhược điểm. Lưu trữ trong cơ sở dữ liệu thường có nghĩa là điều chỉnh các tham số cơ sở dữ liệu và thực hiện một số loại bộ đệm. Sử dụng hệ thống tập tin đòi hỏi bạn phải tìm cách đồng bộ hóa cơ sở dữ liệu + hệ thống tập tin.

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.