Lưu trữ một tệp trong cơ sở dữ liệu trái ngược với hệ thống tệp?


83

Nói chung, mức độ tồi tệ của một lần truy cập hiệu suất đang lưu trữ tệp trong cơ sở dữ liệu (cụ thể là mssql) trái ngược với hệ thống tệp? Tôi không thể đưa ra lý do ngoài khả năng di động của ứng dụng mà tôi muốn lưu trữ các tệp của mình dưới dạng varbinaries trong SQL Server.

Câu trả lời:


77

Hãy xem câu trả lời này:

Lưu trữ hình ảnh trong DB - Yea hay Nay?

Về cơ bản, không gian và hiệu suất đạt được có thể khá lớn, tùy thuộc vào số lượng người dùng. Ngoài ra, hãy nhớ rằng máy chủ Web rẻ và bạn có thể dễ dàng bổ sung thêm để cân bằng tải, trong khi cơ sở dữ liệu là phần đắt nhất và khó mở rộng nhất của kiến ​​trúc web thông thường.

Có một số ví dụ ngược lại (ví dụ: Microsoft Sharepoint), nhưng thông thường, lưu trữ tệp trong cơ sở dữ liệu không phải là một ý kiến ​​hay.

Trừ khi bạn có thể viết các ứng dụng dành cho máy tính để bàn và / hoặc biết đại khái bạn sẽ có bao nhiêu người dùng, nhưng trên một thứ ngẫu nhiên và không thể lường trước được như một trang web công cộng, bạn có thể phải trả một cái giá đắt khi lưu trữ tệp trong cơ sở dữ liệu.


36

Nếu bạn có thể chuyển sang SQL Server 2008, bạn có thể tận dụng hỗ trợ FILESTREAM mang lại cho bạn cả hai điều tốt nhất - các tệp được lưu trữ trong hệ thống tệp, nhưng việc tích hợp cơ sở dữ liệu tốt hơn nhiều so với việc chỉ lưu trữ một đường dẫn tệp trong trường varchar. Truy vấn của bạn có thể trả về một luồng tệp .NET chuẩn, điều này làm cho việc tích hợp trở nên đơn giản hơn rất nhiều.

Bắt đầu với FILESTREAM Storage


1
Tôi đang có một số đặt chỗ ở đây. Cụ thể là khía cạnh khả năng mở rộng và tính khả dụng của mọi thứ: làm cách nào để bạn kiểm soát nơi lưu trữ những "đốm màu" đó?
Dave Van den Eynde,

3
Khả năng mở rộng và tính khả dụng dường như đã được suy nghĩ khá kỹ - hãy xem whitepaper này: msdn.microsoft.com/en-us/library/cc949109.aspx
Jon Galloway

2
Một báo trước này là bạn phải sử dụng tích hợp an ninh (tức là Windows authentication) khi kết nối với cơ sở dữ liệu: blogs.msdn.com/b/psssql/archive/2008/04/10/...
Sven Grosen

22

Tôi muốn nói, nó phụ thuộc vào tình huống của bạn. Ví dụ: tôi làm việc trong chính quyền địa phương và chúng tôi có rất nhiều hình ảnh như ảnh chụp cốc, v.v. Chúng tôi không có số lượng người dùng cao, nhưng chúng tôi cần có bảo mật tốt và kiểm tra dữ liệu. Cơ sở dữ liệu là giải pháp tốt hơn cho chúng tôi vì nó làm cho việc này dễ dàng hơn và chúng tôi sẽ không gặp phải các vấn đề về mở rộng quy mô.



3

Theo kinh nghiệm của riêng tôi, lưu trữ tệp dưới dạng tệp luôn tốt hơn. Lý do là hệ thống tệp được tối ưu hóa để lưu trữ tệp, trong khi cơ sở dữ liệu thì không. Tất nhiên, có một số ngoại lệ (ví dụ như hệ thống tệp MS thế hệ tiếp theo được báo trước nhiều được cho là được xây dựng trên máy chủ SQL), nhưng nói chung đó là quy tắc của tôi.


3

Trong khi hiệu suất là một vấn đề, tôi nghĩ rằng các thiết kế cơ sở dữ liệu hiện đại đã làm cho nó ít hơn nhiều đối với các tệp nhỏ.

Hiệu suất sang một bên, nó cũng phụ thuộc vào dữ liệu được kết hợp chặt chẽ như thế nào. Nếu tệp chứa dữ liệu có liên quan chặt chẽ đến các trường của cơ sở dữ liệu, thì về mặt khái niệm, nó thuộc về nó và có thể được lưu trữ trong một blob. Nếu nó chứa thông tin có khả năng liên quan đến nhiều bản ghi hoặc có thể có một số công dụng bên ngoài ngữ cảnh của cơ sở dữ liệu, thì nó thuộc về bên ngoài. Ví dụ: một hình ảnh trên một trang web được tìm nạp theo một yêu cầu riêng biệt từ trang liên kết đến nó, vì vậy nó có thể thuộc về bên ngoài (tùy thuộc vào thiết kế cụ thể và cân nhắc bảo mật).

Thỏa hiệp của chúng tôi, và tôi không hứa đó là điều tốt nhất, là lưu trữ các tệp XML nhỏ trong cơ sở dữ liệu nhưng hình ảnh và các tệp khác bên ngoài nó.


Bạn coi một tệp nhỏ hay lớn là gì?
ubiquibacon


1

Tôi đồng ý với @ZombieSheep. Chỉ một điều nữa - tôi thường không nghĩ rằng cơ sở dữ liệu thực sự cần phải di động vì bạn bỏ lỡ tất cả các tính năng mà nhà cung cấp DBMS của bạn cung cấp. Tôi nghĩ rằng việc di chuyển sang một cơ sở dữ liệu khác sẽ là điều cuối cùng người ta sẽ xem xét. Chỉ $ 0,02 của tôi


1

Việc phải phân tích cú pháp một đốm màu (hình ảnh) thành một mảng byte và sau đó ghi nó vào đĩa với tên tệp thích hợp và sau đó đọc nó đủ để ngăn bạn làm điều này quá thường xuyên, đặc biệt là nếu các tệp khá lớn.


1
Tôi không thấy bất cứ nơi nào đề cập rằng "tệp" này cần được ghi vào đĩa và đọc lại.
Dave Van den Eynde,

Đây là một nhiệm vụ ngầm khi hình ảnh phải được hiển thị sau đó, đặc biệt là khi được lưu trữ ở các định dạng khác nhau hoặc trong các tình huống mà chúng không thể được lưu giữ trong bộ nhớ trong khoảng thời gian dài, do kích thước tuyệt đối.
Jon Limjap 28/09/09

0

Không phải mơ hồ hay bất cứ điều gì nhưng tôi nghĩ loại 'tệp' bạn sẽ lưu trữ là một trong những yếu tố quyết định lớn nhất. Nếu về cơ bản bạn đang nói về một trường văn bản lớn có thể được lưu trữ dưới dạng tệp thì tùy chọn của tôi sẽ là lưu trữ db.

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.