2009-04-09 39 views
8

Sử dụng Rails, có lý do nào để lưu trữ tệp đính kèm (có thể là tệp bất kỳ lúc nào), trong hệ thống tệp thay vì trong cơ sở dữ liệu không? Cơ sở dữ liệu dường như đơn giản hơn với tôi, không cần phải lo lắng về đường dẫn hệ thống tập tin, cấu trúc, vv, bạn chỉ cần nhìn vào trường blob của bạn. Nhưng hầu hết mọi người dường như sử dụng hệ thống tập tin mà nó để lại cho tôi đoán rằng phải có một số lợi ích để làm như vậy mà tôi không nhận được, hoặc một số nhược điểm khi sử dụng cơ sở dữ liệu để lưu trữ như vậy. (Trong trường hợp này, tôi đang sử dụng postgres).Đường ray: Lưu trữ các tệp nhị phân trong cơ sở dữ liệu

Trả lời

26

Đây là một câu hỏi thiết kế khá chuẩn, và không thực sự là một "câu trả lời đúng".

Quy tắc chung mà tôi thường theo dõi là "dữ liệu đi vào cơ sở dữ liệu, tệp đi trong tệp".

Một số trong những cân nhắc cần lưu ý:

  1. Nếu một tập tin được lưu trữ trong cơ sở dữ liệu, làm thế nào thì bạn sẽ để phục vụ nó ra qua http? Hãy nhớ rằng, bạn cần đặt loại nội dung, tên tệp, v.v. Nếu đó là tệp trên hệ thống tệp, máy chủ web sẽ xử lý tất cả nội dung đó cho bạn. Rất nhanh chóng và hiệu quả (có lẽ ngay cả trong không gian hạt nhân), không cần mã giải thích.

  2. Tệp thường lớn. Cơ sở dữ liệu lớn là chắc chắn khả thi, nhưng chúng chậm và bất tiện để sao lưu vv Tại sao làm cho cơ sở dữ liệu của bạn rất lớn khi bạn không phải?

  3. Giống như 2., thật dễ dàng để sao chép tệp sang nhiều máy. Giả sử bạn đang chạy một cụm, bạn chỉ có thể định kỳ rsync hệ thống tập tin từ máy chủ của bạn đến các nô lệ của bạn và sử dụng tiêu chuẩn http phục vụ tĩnh. Rõ ràng cơ sở dữ liệu cũng có thể được nhóm lại, nó không nhất thiết phải trực quan.

  4. Trên mặt trái của 3, nếu bạn đã phân cụm cơ sở dữ liệu của mình, thì việc xử lý các tệp được nhóm lại là sự phức tạp về quản trị. Đây sẽ là một lý do để xem xét lưu trữ các tập tin trong DB, tôi muốn nói.

  5. Dữ liệu Blob trong cơ sở dữ liệu thường không rõ ràng. Bạn không thể lọc, sắp xếp theo nhóm hoặc nhóm theo nó. Điều đó làm giảm giá trị của việc lưu trữ nó trong cơ sở dữ liệu.

  6. Mặt khác, cơ sở dữ liệu hiểu được sự tương tranh. Bạn có thể sử dụng mô hình phân tách giao dịch chuẩn của mình để đảm bảo rằng hai khách hàng không cố chỉnh sửa cùng một tệp tại cùng một thời điểm. Điều này có thể tốt đẹp. Không phải để nói rằng bạn không thể sử dụng lockfiles, nhưng bây giờ bạn đã có hai điều cần hiểu thay vì một.

  7. Trợ năng. Các tập tin trong một hệ thống tập tin có thể được mở bằng các công cụ thông thường. Vi, Photoshop, Word, bất cứ điều gì bạn cần. Điều này có thể thuận tiện. Làm thế nào bạn sẽ mở tài liệu từ đó ra khỏi một lĩnh vực blob?

  8. Quyền. Hệ thống tập tin có quyền, và chúng có thể là một cơn đau ở phía sau. Ngược lại, chúng có thể hữu ích cho ứng dụng của bạn. Quyền sẽ thực sự cắn bạn nếu bạn đang tận dụng lợi thế của 7, bởi vì nó gần như đảm bảo rằng máy chủ web của bạn chạy với quyền khác nhau hơn so với các ứng dụng của bạn.

  9. Bộ nhớ đệm (từ sarah mei bên dưới). Điều này xảy ra với câu hỏi http ở phía bên phía khách hàng (bạn sẽ nhớ đặt thời gian hoạt động chính xác không?). Trên các tệp phía máy chủ trên một hệ thống tệp là một mẫu truy cập rất được hiểu rõ và được tối ưu hóa. Các trường blob lớn có thể hoặc không được tối ưu hóa tốt bởi cơ sở dữ liệu của bạn, và bạn gần như được bảo đảm để có thêm một chuyến đi mạng từ cơ sở dữ liệu đến máy chủ web.

Tóm lại, mọi người có xu hướng sử dụng hệ thống tệp cho tệp vì chúng hỗ trợ thành ngữ giống như tệp. Không có lý do bạn phải làm điều đó mặc dù, và hệ thống tập tin đang ngày càng trở nên giống như cơ sở dữ liệu vì vậy nó sẽ không ngạc nhiên tôi ở tất cả để xem một hội tụ hoàn toàn cuối cùng.

+0

Cảm ơn, Erik. Đó là một câu trả lời rất hữu ích và toàn diện. –

+0

7. Bạn có nghĩa là làm việc trực tiếp trên máy chủ không? Như một tập tin, tôi cũng tải nó xuống trước khi mở nó trong photoshop. Hoặc hệ thống phiên bản của tôi sẽ làm điều đó cho tôi. – Luc

+0

Lưu trữ mọi thứ trong hệ thống tệp cục bộ không được sao chép thường phá vỡ các ứng dụng kiểu 12factor, điều này làm cho việc mở rộng ứng dụng trung bình hoặc tốt hơn có vấn đề. Việc lưu trữ các phần đính kèm trong một chương trình phụ trợ sao chép S3/CloudFront hoặc tương tự là cách để sử dụng cho hầu hết các trường hợp sử dụng (nhưng không phải tất cả). CarrierWave, Paperclip, v.v. có thể giúp trừu tượng hóa những khác biệt đó. – Barry

2

Câu trả lời của Erik thật tuyệt vời. Tôi cũng sẽ thêm rằng nếu bạn muốn thực hiện bất kỳ bộ nhớ đệm nào, việc lưu các tệp tĩnh tĩnh dễ dàng hơn và đơn giản hơn nhiều so với các nội dung cơ sở dữ liệu trong bộ nhớ cache.

0

Nếu bạn sử dụng plugin như Paperclip, bạn cũng không phải lo lắng về bất kỳ điều gì. Có điều này được gọi là hệ thống tập tin, đó là nơi các tập tin nên đi. Chỉ vì nó là một chút khó khăn hơn không có nghĩa là bạn nên đặt các tập tin của bạn ở vị trí sai. Và với kẹp giấy (hoặc các plugin tương tự khác) thì không khó. Vì vậy, hệ thống tập tin gogo!

+1

những gì về việc đảm bảo chỉ những người dùng thích hợp mới có thể xem/truy cập các tệp - liệu Paperclip có quan tâm đến điều này không? – Greg

+0

Đó là một trường hợp cực kỳ cạnh tranh. Không bao giờ facebook bảo vệ hình ảnh của họ (ngoài việc cho hình ảnh những URL rất độc ác). –

+0

Một cách để làm điều này sẽ là trong quá trình sản xuất đặt các tệp phía sau máy chủ Apache, tệp .htaccess có thể đóng tệp này. Vấn đề? Lấy các tập tin. Tôi không chắc chắn nếu điều này là có thể trong đường ray nhưng trong PHP, bạn có thể lấy các tập tin từ một thư mục được bảo vệ .htaccess sau khi kiểm tra nếu người dùng có permisions để xem nó. Tất nhiên, tập lệnh PHP nằm trong một thư mục công cộng khác. –

6

Có một số lời khuyên hữu ích về cách sử dụng hệ thống tệp cho tệp, nhưng đây là điều khác cần suy nghĩ. Nếu bạn đang lưu trữ các tệp/tệp đính kèm nhạy cảm hoặc an toàn, việc sử dụng DB thực sự là cách duy nhất để thực hiện. Tôi đã tạo các ứng dụng nơi dữ liệu không thể được đưa ra trên một tệp. Nó phải được đưa vào DB vì lý do bảo mật. Bạn không thể để nó trong một hệ thống tệp cho người dùng trên máy chủ/máy để xem hoặc mang theo chúng mà không có sự bảo mật thích hợp. Sử dụng một DB cao cấp như Oracle, bạn có thể khóa dữ liệu đó rất chặt chẽ và đảm bảo rằng chỉ những người dùng thích hợp mới có quyền truy cập vào dữ liệu đó.

Nhưng các điểm khác được thực hiện rất hợp lệ. Nếu bạn chỉ đơn giản là làm những việc như hình ảnh đại diện hoặc thông tin không nhạy cảm, hệ thống tệp thường nhanh hơn và thuận tiện hơn cho hầu hết các hệ thống plugin.

DB khá dễ thiết lập để gửi tệp lại; đó là một chút công việc hơn, nhưng chỉ một vài phút nếu bạn biết những gì bạn đang làm. Vì vậy, có, hệ thống tập tin là cách tốt hơn để đi tổng thể, IMO, nhưng DB là sự lựa chọn duy nhất khả thi khi bảo mật hoặc dữ liệu nhạy cảm là một mối quan tâm lớn.

+0

Điều này đúng. Cố gắng đồng bộ hóa các quy tắc bảo mật trên toàn hệ thống tập tin và cơ sở dữ liệu đồng thời là khó khăn nhất. – easel

+0

Trong khi nó có thể là imposible một ý tưởng sẽ là một cái gì đó giống như Linux với.htaccess tập tin trên hệ thống tập tin ngăn chặn người xem web trái phép nhìn thấy tập tin, hoặc bạn có thể lưu nó ra khỏi thư mục web-server công cộng và có một liên kết refrence với nó. PHP, tôi biết cho một thực tế có thể kéo các tập tin từ một nơi nào đó không công khai trong hệ điều hành nếu nó có quyền hạn. –

1

Tôi không thấy vấn đề với blobstores là gì. Bạn luôn có thể xây dựng lại kho lưu trữ hệ thống tệp từ đó, ví dụ: bằng cách lưu trữ nội dung vào máy chủ web cục bộ trong khi hệ thống đang được sử dụng. Nhưng cửa hàng có thẩm quyền phải luôn là cơ sở dữ liệu. Điều đó có nghĩa là bạn có thể triển khai ứng dụng của mình bằng cách tung vào cơ sở dữ liệu và xuất mã từ kiểm soát nguồn. Làm xong. Và thêm một máy chủ web là không có vấn đề gì cả.

+0

Dựa trên kinh nghiệm sản xuất, tôi tin câu trả lời này là câu trả lời đúng. – cfeduke

Các vấn đề liên quan