2011-10-28 40 views
7

Tôi đang làm việc trên trang web cho phép người dùng tải lên tệp (hình ảnh và các cách khác). Tôi không có bất kỳ kinh nghiệm nào trước đây trong lĩnh vực này và hy vọng sẽ nhận được một số đầu vào đúng cách để lưu trữ và lập chỉ mục các tệp này.Lưu trữ các tệp do người dùng tải lên trên máy chủ web

Mặc dù tôi muốn có một kiến ​​trúc có quy mô tốt với dữ liệu khối lượng lớn, hiện tại tôi không lo lắng về khối lượng rất cao (facebook-, google-scale).

Tôi đã nghĩ đến việc lưu trữ các tập tin trên hệ thống tập tin tại

/files/{username}/ 

Và sau đó có một cơ sở dữ liệu uploads nơi mỗi người dùng có bảng riêng của mình với tên tập tin (và do đó URL) của mỗi tập tin ông đã được tải lên (và bất kỳ thông tin bổ sung nào khác mà tôi có thể muốn lưu trữ). Kết thúc cơ sở dữ liệu này (cho mỗi người dùng bảng của riêng mình) có vẻ rất không hiệu quả đối với tôi, nhưng vẫn duy trì hồ sơ của tất cả các tệp trong một bảng không có vẻ đúng và nó sẽ yêu cầu tìm kiếm toàn bộ bảng mỗi lần một tệp được truy cập.

Lý do của tôi đằng sau việc cân nhắc việc đưa từng người dùng vào bảng của riêng mình là cách gọn gàng và khác biệt để phân đoạn dữ liệu trên các bảng và giảm thời gian tìm kiếm khi tìm kiếm tệp.

Trả lời

3

Những gì Matt H đề xuất là ý tưởng hay nếu những gì bạn đang cố gắng đạt được là quyền truy cập hình ảnh ở cấp người dùng. Nhưng nếu bạn bị giới hạn trong không gian lưu trữ cơ sở dữ liệu của mình, việc lưu trữ các hình ảnh ở dữ liệu nhị phân sẽ không hiệu quả như bạn đã nói.

Sử dụng bảng trên mỗi người dùng là thiết kế kém. Người dùng đã tải lên tệp chỉ đơn giản là một trường/cột trong bảng lưu trữ tất cả các tệp tải lên, cùng với bất kỳ siêu dữ liệu tệp nào. Tôi đề nghị tạo GUID cho tên tệp, được đảm bảo là duy nhất và tốt hơn trường tự động phát hiện dễ đoán nếu bạn đang cố ngăn người dùng truy cập tất cả các hình ảnh. Bạn có quan tâm đến hiệu suất, nhưng cho đến khi bạn đang xử lý hàng triệu triệu bản ghi, truy vấn của bạn để chọn hình ảnh thuộc về người dùng, được tải lên trong một khung thời gian cụ thể (nói rằng bạn đang lưu trữ dấu thời gian hoặc tương tự) về chi phí. Nếu tốc độ là một vấn đề, bạn có thể thêm chỉ mục B-tree vào tên người dùng, điều này sẽ tăng tốc đáng kể các truy vấn hình ảnh cụ thể của người dùng của bạn.

Quay lại chủ đề bảo mật, quyền truy cập và tổ chức.Lưu trữ hình ảnh với một thư mục cho mỗi người dùng (mặc dù tùy thuộc vào số lượng người dùng, số lượng thư mục có thể phát triển đến mức không thể quản lý). Nếu bạn không muốn hình ảnh có sẵn công khai, hãy lưu trữ chúng trong một thư mục không phải web, để ứng dụng của bạn đọc dữ liệu và truyền tải nó để hiển thị hình ảnh cho người dùng. Phức tạp hơn nhưng bạn ẩn các tập tin thực tế từ internet. Ngoài ra, bạn sẽ có thể xác thực tất cả yêu cầu cho hình ảnh của người dùng được xác thực.

3

Tùy thuộc vào bản chất và cấu trúc của ứng dụng và cơ sở dữ liệu của bạn. Tôi đã sử dụng nhiều kỹ thuật, bao gồm thư mục dựa trên, hình ảnh được lưu trữ trong một blob cơ sở dữ liệu, thư mục tệp ngoài web được truy cập thông qua cổng xác thực ...

Đối với hình ảnh bên ngoài không liên quan trực tiếp đến ứng dụng hoặc cơ sở dữ liệu , như ảnh tạm thời hay gì đó, tôi có xu hướng đặt những bức ảnh đó vào một thư mục. Vì có vẻ như cấu trúc của bạn là hình ảnh từ một người dùng, sau đó tôi hy vọng có thể có siêu dữ liệu được liên kết với hình ảnh, chẳng hạn như thẻ. Trong trường hợp đó, tôi có lẽ sẽ lưu trữ hình ảnh trong một bảng cơ sở dữ liệu, giả sử tôi có khả năng cho điều đó. Nếu các bức ảnh cần được bảo mật, không thể tiếp cận được với những người dùng khác mà không cần xác thực thì cơ sở dữ liệu sẽ có bảo mật riêng, trong khi lưu trữ dựa trên tệp sẽ cần một số mẹo để ngăn chặn truy cập trái phép.

Tôi sẽ không sử dụng bảng cho mỗi người dùng, chỉ cần một bảng Ảnh có các phần tử ID, userid, blob ảnh.

Điều đó có hữu ích không?

+0

Nó sẽ giúp ích. Tuy nhiên, có một vài vấn đề. Hiện tại, chúng tôi đang sử dụng máy chủ web chia sẻ giới hạn ở mức 1 GB cho mỗi cơ sở dữ liệu, do đó việc lưu trữ ảnh/tệp dưới dạng blob trong cơ sở dữ liệu sẽ không khả thi. Ngoài ra, sẽ không có tất cả các hình ảnh trong một bảng tăng thời gian tìm kiếm cho một bức tranh cụ thể? Lý do của tôi đằng sau một bảng cho mỗi người dùng là, biết người dùng, tôi sẽ biết bảng để tìm kiếm và do đó phải tìm kiếm thông qua các bản ghi ít hơn (nghĩ về nó như sharding dựa trên userid). Điều đó không có ý nghĩa? Có cái gì tôi đang mất tích? – xbonez

+1

Kích thước của chỉ mục ảnh hưởng đến việc thực hiện SQL, nhưng một tập hợp lớn các đốm màu không được lập chỉ mục sẽ không đáng chú ý. Nhưng đó là một điểm tranh luận nếu bạn không có không gian. Trong trường hợp đó, bạn sẽ cần phải lưu trữ chúng trong hệ thống tập tin. Một cấu trúc thư mục userid/photos là okay nếu bạn có một LOT của chúng, như tránh một filecount lớn trong một thư mục duy nhất là một thực hành tốt. Tôi sẽ đặt một .htaccess tại chỗ để tránh truy cập trực tiếp (giả sử bạn cần auth để truy cập chúng), và sử dụng một hình ảnh? Id = bất cứ điều gì mà thay đổi các tiêu đề để hình ảnh/jpeg hoặc bất cứ điều gì, và echo readfile của hình ảnh. –

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