2009-03-22 9 views
12

큰 프로젝트 내에서 파일 관리 및 저장에 관해서는 여기에 아주 좋은 질문이 있습니다.많은 수의 파일을 관리하기위한 팁?

Storing Images in DB - Yea or Nay?
Would you store binary data in database or in file system?

훌륭한 통찰력을 갖는 첫 번째 내 프로젝트에서 내가 파일 경로가 아닌 DB의 경로를 이동하기로 결정했습니다.

파일 시스템 사용에 대한 주요 포인트는 백업입니다. 그러나 우리 시스템에서는 훌륭한 백업 구성표가 있으므로 걱정할 필요가 없습니다.

다음 경로는 실제 파일을 저장하는 방법입니다. 그리고 나는 항상 파일의 위치를 ​​정적으로 생각하고 사물의 데이터베이스 측에 가상 디렉터리 시스템을 만들 생각을했습니다. 따라서 파일에 대한 링크는 변경되지 않습니다.

내가 구축중인 시스템에는 하나의 전역 파일 관리가 있으므로 모든 파일에 모든 사용자가 액세스 할 수 있습니다. 그러나 많은 사람들이 실제 디렉토리 크기에 대한 파일 경로 이야기 (예 : 모든 파일이 하나의 디렉토리 내에있는 경우)

내 질문은 이러한 고정 파일에 대한 폴더를 만드는 데 유용한 팁이나 권장 방법이 무엇인지, 또는 내가 가상 디렉토리 경로를 전혀 가져서는 안됩니다.

+1

어쩌면 한번보세요 : http://stackoverflow.com/questions/191845/how-to-store-images-in-your-filesystem – Jacco

+0

나는 이미지를 저장하는 것이 아니라 모든 유형을 저장하고 있습니다. –

+0

하지만 동일한 원칙/문제가 적용됩니다. – Jacco

답변

11

한 가지 방법은 각 파일에 고유 번호를 할당하고 실제 파일 위치를 검색하는 데 사용하는 것입니다

(즉, 전혀 도움이된다면이 프로젝트는 LAMP 스택 (PHP)에있다). 그런 다음 그 번호를 사용하여 파일 시스템의 다른 디렉토리에있는 파일을 배포합니다. 예를 들어, 당신은이 제도 같은 것을 사용할 수 있습니다

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number/100) % 100
{2}: file_number

+0

나는 실제로 비슷한 것을 가지고 있었지만 그 밑에 디렉토리를 계속 추가하기 위해 숫자가 커지면 계속 생각하고 있 었는가? 또한 파일이 생성 된 날짜 (또는 달)부터 지시자를 만드는 방법에 대해 생각해 보았지만 한 달이 파일에 너무 무거울 경우 어떻게해야합니까? –

+0

이 방법을 사용하면 파일을보다 균일하게 배포 할 수 있습니다. 날짜 - 시간은 날짜를 저장하고 조회해야하는 단점이 있습니다. 다른 서버 아래에 일부 디렉토리를 마운트하여이 방법을 확장 가능하게 만들 수 있습니다. –

6

하나의 디렉토리에있는 항목의 과도한 수를 만들지 않도록하기 위해, 당신 파일 이름 부분에 디렉토리를 만드는 것을 기본으로 할 수 있습니다. 예를 들어, d7f5ae9b7c5a.png 파일이 있다면 media/d7/f5/d7f5ae9b7c5a.png에 저장할 수 있습니다. 파일 이름이 모두 16 진수이면 단일 디렉토리의 항목 수를 최종 레벨까지 256까지 제한합니다.

+0

악센트 부호가있는 문자 또는 공백이있는 파일에 문제가 있습니까? 그러나 나는 아마도 그 캐릭터들을 스트립 핑/번역 할 것입니다, 좋은 제안입니다. –

+0

파일 이름에 해시를 사용하면 비 ASCII 문자가 나타나는 유일한 위치는 데이터베이스에 있으며 파일 시스템보다 데이터베이스에서 처리하는 것이 더 쉽습니다. –

1

나는 보통이 방법을 :

는 업로드 된 파일을 저장하는 폴더를 가리키는 응용 프로그램에 대한 전역 설정 변수가. 데이터베이스에서 파일에 대한 상대 경로를 저장합니다 (설정 변수가 가리키는 것과 관련됨).

파일이 /www/uploads/image.jpg에 있으면 설정 값에/www/uploads가 표시되고 데이터베이스 행에는 image.jpg가 있습니다. 이는 시스템 디렉토리 구조와 응용 프로그램을 분리하는 유연한 방법입니다.

또한 관련 데이터베이스 테이블을 기반으로 디렉토리에서 파일 저장소를 조각 낼 수 있습니다. user_reports 테이블과 user_photos 테이블이 있다고합시다./www/uploads/user_reports에 user_reports와 관련된 파일을 저장합니다.사용자 업로드 수가 많으면 분열을 훨씬 더 구현할 수 있습니다. 사용자가 20.03.2009에 파일을 업로드한다고 가정하면 파일은 report.pdf이므로 /www/uploads/user_reports/2009/03/20/report.pdf에 저장하십시오.

2
  1. 한 사용자 이미지 ~ 100킬로바이트, 그래서 데이터베이스 (10) 000 사용자를 보자, 각 사용자는 평균 5 개 이미지에있을 것이다, 그래서 우리는 5 테라 바이트를 DB가되며, 각 이미지의 출력은 DB와를 통해 실행됩니다 이 추가 DB 트래픽은 일반 DB 서버 성능을 저하시킵니다. ... DB 클러스터를 사용하여이 문제를 피할 수 있지만 비싸다고 가정 해보십시오.

  2. 실제 데이터베이스의 오류에 대한 사용자 보고서 (테스트 중 - 모두 올바르게 작동 함), 개발자에게 패키지를 압축 해제하는 방법은 무엇입니까? 기계? 시간이 얼마나 걸리나요?

  3. 한 번에 일부 CDN에 이미지를 넣을 수 있습니다. 소스 코드의 변경 내용은 무엇입니까?

+0

실제 이미지 데이터에 데이터베이스를 사용하고 있지 않습니다. –

9

많은 파일을 호스팅하는 웹 사이트에서이 문제가 발생했습니다. 우리가 한 것은 GUID (파일의 기본 키 필드이기도 함) (예 : BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301)를 가져 와서/B/C/C/BCC46E3F-2F7A-42b1과 같은 파일을 저장하는 것입니다. -92CE-DBD6EC6D6301/여기서 filename.ext

이 특정 장점이 있습니다

  • 여러 서버를 통해 파일 서버를 확장 (각 하나에 특정 디렉토리를 지정) 시작할 필요가 없습니다
  • 수 파일의 이름을 바꾸려면
  • 디렉토리가 고유해야합니다.

희망이 도움이됩니다!

1

아파치와 PHP가 파일을 관리하는 방법에 대해서는 많이 말할 수 없지만 ext3 파일 시스템에 관해 말할 수 있습니다. ext3는 동일한 디렉토리에있는 많은 수의 파일에 문제가있는 것 같지 않습니다. 최대 백만 개의 파일로 테스트했습니다. 디렉토리를 작성하기 전에 파일 시스템에서 dir_index 옵션이 사용 가능한지 확인하십시오. dump2fs를 실행하여 확인하고 tune2fs를 실행하여이 옵션을 변경할 수 있습니다. 명령 줄 도구는 여전히 디렉터리의 내용을 나열하는 데 문제가있을 수 있으므로 파일을 하위 디렉터리 트리로 해시하는 것은 유용 할 수 있습니다.

관련 문제