2011-10-28 10 views
7

사용자가 파일 (그림 등)을 업로드 할 수있는 웹 사이트에서 작업하고 있습니다. 필자는이 분야에 대한 사전 경험이 없으며 이러한 파일을 저장하고 색인을 생성하는 올바른 방법을 알기를 희망했습니다.웹 서버에 사용자 업로드 파일 저장

대용량 데이터에 잘 맞도록 아키텍처를 만들고 싶지만, 현재는 매우 높은 (페이스 북, 구글 스케일) 볼륨에 대해 걱정하지 않습니다.

내가

/files/{username}/ 

에서 파일 시스템에있는 파일을 저장하는 생각 그리고 데이터베이스 각 사용자가 자신이 업로드 한 각 파일의 파일 이름 (및 URL을)와 함께 자신의 테이블이 uploads을 가지고 있었다 (그리고 내가 저장할 수있는 다른 추가 정보). 이 (각 사용자에게 자신의 테이블을 제공하는) 데이터베이스의 끝은 나에게는 매우 비효율적 인 것처럼 보이지만 단일 테이블에있는 모든 파일의 레코드를 유지하는 것이 옳지 않을뿐만 아니라 단일 파일마다 전체 테이블을 검색해야합니다. 액세스됩니다.

각 사용자에게 자신의 테이블을 제공하는 것에 대한 나의 추론은 사용자가 주어진 파일을 찾을 때 테이블 전체에서 데이터를 분할하고 검색 시간을 줄이는 깔끔하고 독특한 방법이었습니다.

답변

3

달성하고자하는 것이 사용자 수준의 이미지 액세스 인 경우 Matt H은 좋은 아이디어입니다. 그러나 데이터베이스 저장 공간이 제한적이라는 점을 감안할 때 이진 데이터로 이미지를 저장하는 것은 명시한대로 비효율적입니다.

사용자 당 테이블을 사용하는 것은 좋지 않습니다. 파일을 업로드 한 사용자는 파일 메타 데이터와 함께 모든 파일 업로드를 저장하는 표의 필드/열이어야합니다. 고유 한 것으로 보장 된 파일 이름에 대한 GUID를 생성하고 사용자가 단순히 모든 이미지에 액세스하지 못하도록하려는 경우 쉽게 추측 할 수있는 자동 증가 필드보다 좋습니다.

수백만 개의 레코드를 처리 할 때까지는 이미지를 선택하는 쿼리가 사용자에게 속하며 특정 시간 프레임 내에 업로드됩니다 (타임 스탬프 또는 이와 유사한 데이터를 저장한다고 가정). 비용. 속도가 문제가되면 사용자 이름에 B- 트리 색인을 추가 할 수 있습니다. 이렇게하면 사용자 특정 이미지 검색어가 크게 빨라질 수 있습니다.

보안, 액세스 및 조직이라는 주제로 돌아갑니다.사용자 당 폴더로 이미지를 저장하십시오 (사용자 수에 따라 다르지만 관리 할 수없는 수준까지 늘어날 수 있음). 이미지를 공개적으로 사용할 수 없도록하려면 웹 이외의 폴더에 저장하고 응용 프로그램에서 데이터를 읽고 스트림하여 이미지를 렌더링합니다. 더 복잡하지만 인터넷에서 실제 파일을 숨 깁니다. 또한 인증 된 사용자가 이미지에 대한 모든 요청의 유효성을 검사 할 수 있습니다.

3

앱 및 데이터베이스의 특성과 구조에 따라 다릅니다. 나는 데이터베이스 기반의 blob에 저장된 그림, 인증 게이트웨이를 통해 액세스하는 웹 외부의 파일 폴더 등 많은 기술을 사용했습니다 ...

앱 또는 데이터베이스와 직접 관련이없는 외부 이미지 임시 사진이나 뭐 그런 것처럼, 나는 그 사진들을 폴더에 넣는 경향이있다. 귀하의 구조가 사용자의 사진 인 것처럼 보이기 때문에 태그와 같이 이미지와 관련된 메타 데이터가있을 것으로 예상됩니다. 이 경우, 필자는 데이터베이스 테이블에 그림을 저장할 것입니다. 사진을 안전하게해야하고 인증없이 다른 사용자가 액세스 할 수없는 경우 데이터베이스는 자체 보안 기능을 갖지만 파일 기반 저장소는 무단 액세스를 방지하기 위해 일종의 트릭이 필요합니다.

사용자 당 표를 사용하지 않고 ID, 사용자 ID, 그림 BLOB 요소가있는 사진 표만 사용합니다.

도움이 되었습니까?

+0

도움이됩니다. 그러나 몇 가지 문제가 있습니다. 현재 우리는 데이터베이스 당 1GB로 제한하는 공유 웹 서버를 사용하고 있기 때문에 데이터베이스 자체에 블롭으로 그림/파일을 저장할 수 없습니다. 또한 특정 사진의 검색 시간을 늘리면 한 테이블에 모든 사진이 표시되지 않을까요? 사용자 당 테이블에 대한 나의 추론은 사용자를 안다는 이유에서 어떤 테이블을 검색해야 하는지를 알 수 있고, 따라서 더 적은 레코드를 검색해야한다는 것입니다 (사용자 ID를 기반으로하는 샤딩으로 생각하십시오). 그게 말이되지 않을까요? 내가 빠진 것이 있습니까? – xbonez

+1

인덱스의 크기는 SQL 실행에 영향을 미치지 만 인덱싱되지 않은 많은 수의 블롭은 눈에 띄지 않습니다. 그러나 공간이 없다면 그것은 논점의 하나입니다. 이 경우 파일 시스템에 저장해야합니다. 한 폴더에 많은 수의 파일을 피하는 것이 좋은 습관 인 것처럼 사용자 ID/사진 폴더 구조는 많아도 괜찮습니다. 직접 액세스를 피하기 위해 .htaccess를 두었다가 (액세스 권한이 필요하다고 가정 할 때) 사진을 사용합니까? id = 이미지/jpeg 또는 기타로 헤더를 변경하고 readfile의 이미지를 echo합니다. –