2009-10-09 2 views
9

가능한 중복 : 나는 웹 응용 프로그램을 개발하기 시작하고
storing uploaded photos and documents - filesystem vs database blob사진을 어디에 저장해야합니까? 파일 시스템 또는 데이터베이스?

는, 주된 목적은의 사진을 표시하는 것입니다. 사용자는 사진을 업로드 할 수도 있습니다.

처음 제기 된 질문은 파일 시스템이나 데이터베이스에서 사진을 저장할 위치입니다.

사이트를 호스팅하는 데 Windows 상자가 사용됩니다. 데이터베이스는 MySQL이고 백엔드 코드는 ASP.NET MVC를 사용하는 C#입니다.

+12

거룩한 전쟁이 시작하자 .... –

+0

@Locksfree 이미지의 수천 수 있습니다. 사람들이 실제로 사이트를 사용하는지 여부에 따라 더 많을 수 있습니다. – AngryHacker

답변

28

당신이 thedailywtf에 대한 이야기를 목표로하지 않는 한, 물론 파일 시스템. 가장 쉬운 방법은 SHA-1 해시와 같이 파일 자체에서 파생 될 수있는 속성으로 사진을 정리하는 것입니다. 그런 다음 사진의 기본 키 및 기타 속성 (업로드 한 사용자, 업로드 날짜 등)에 첨부 된 해시를 데이터베이스에 저장하십시오.

파일 시스템에서 사진을 나누는 것도 좋은 생각입니다. 따라서 한 디렉토리에 수백만 개의 파일이 생성되지는 않습니다. 따라서 다음과 같은 내용을 갖게됩니다.

storage/00/e4/f56c0de1c61fdb926e79e8a0a65bd12930c9.jpg 
storage/25/9a/ec1c55bfb660548a6770238668c4b117d92f.jpg 
storage/5d/d5/4b01d98f17a9ad9dd1526b49ba39b5aa37a1.jpg 
storage/63/49/6f740b6c284ce6685dc17d473a7360ace249.jpg 
storage/b1/75/066d178188dde110149a8422ab651b0ee615.jpg 
storage/b1/20/a2b7d02b7b0c43530677ab06235382a37e20.jpg 
storage/da/39/a3ee5e6b4b0d3255bfef95601890afd80709.jpg 

샤드 드 스토리지로 이동 한 경우이 포트를 쉽게 사용할 수 있습니다.

+1

디렉토리 및 파일 이름을 만드는 SHA-1 해시 아이디어가 훌륭합니다. 답변을 수락했습니다. – AngryHacker

+2

하지만 삭제하는 것은 어떨까요? 예 : 2 명의 사용자가 동일한 파일을 업로드했습니다. 따라서 해시 (경로)가 동일하므로 하나의 파일 만 존재하게됩니다. 그들 중 하나가 사진을 삭제하면 두 번째 사용자도 사진을 잃어 버리게됩니다. 내가 맞습니까? – binball

+0

@ John Millikin, 데이터베이스에 저장 디렉터리를 생성하고 저장하는 방법은 무엇입니까? –

3

일반적으로 사람들은 이미지가 아닌 파일과 같은 바이너리 데이터를 데이터베이스가 아닌 데이터베이스에 저장합니다. 데이터베이스에서 파일 시스템 경로를 참조합니다. 데이터베이스에서 BLOB (2 진 대형 오브젝트)을 검색하는 것은 웹 서버가 파일 시스템에서 정적 파일을 제공하는 것을 허용하는 것보다 느립니다.

2

blob 데이터베이스를 사용하면 일상 생활을 쉽게 처리 할 수 ​​있습니다. 파일 시스템 관리라는 악몽을 잊어 버려야합니다. 경험에서

편집

ID
VARBINARY

이 바이너리 파일을 관리 할 수있는 효율적인 방법입니다. 바이너리 파일 만있는 데이터베이스가 하나 있습니다. 백업하는 것이 어떻게 더 힘들 수 있습니까?

+1

데이터베이스를 백업해야하고, * surprise *가 필요할 때까지는 수천 개의 바이너리 가비지가 메타 데이터와 함께 섞여 있습니다. –

+1

그렇습니다. 모든 소프트웨어 아키텍처의 주된 목표가되어야합니다 ... 개발자의 "인생을 아주 편하게"하십시오. 데이터가 아닌 이미지를 저장하기 위해 만들어진 서버에서 이미지를 가져올 때까지 기다려야하는 멀티 테라 바이트 데이터베이스 또는 사용자를 처리해야하는 작업에 대해서는 잊어 버리십시오. –

+0

너희들은 이진 데이터를 저장하지 않는 타당한 이유를 제안했다. 이것은 수년간 분출 된 오래된 구상입니다. – ChaosPandion

3

아마존 S3와 같은 것을 사용할 것입니다.

그러나 선택 사항이 파일 시스템과 데이터베이스 사이에있는 경우 파일 시스템의 서버 이미지보다 데이터베이스보다 더 빠르기 때문에 파일 시스템을 선택합니다.

3

데이터베이스에 BLOB으로 사진을 넣을 유일한 이유는 서버 클러스터가 있고 데이터베이스 복제를 사용하여 클러스터의 모든 컴퓨터에 사진을 자동으로 복사했기 때문입니다.

사진을 파일로 저장하고 사진 파일 이름을 데이터베이스에 저장하면 훨씬 간단합니다. 사진에 대해 고유 한 파일 이름을 작성해야하는 경우 데이터베이스의 기본 키 정수를 파일 이름의 일부로 사용할 수 있습니다. 그러나 John Milliken이 제안한 것처럼 사진 자체의 해시를 사용할 수도 있습니다. 간단하고 간단합니다.

+0

도 파일 시스템에서 수행 할 수 있습니다. DB에 이미지를 넣을 필요가 없습니다. –

+1

"할 수도 있습니다"? 그것은 다소 간결합니다. 자동 복제를 수행 할 수 있다고 말하고 있습니까? 나는 그렇게 추정한다. 누군가가 파일 복제 시스템을 작성해야합니다. 그러나 이미 데이터베이스 복제를 설정 한 경우 두 개의 개별 복제 시스템을 구성하고 디버깅하는 대신 사진을 간단히 밀어 넣는 것이 더 간단 할 수 있습니다. 동의하지 않니? – steveha

3

백업을 만들고 참조 무결성을 유지하는 등 모든 것이 데이터베이스에 있으면 관리가 더 쉽다고 지적하는 사람들이 있습니다.

+0

DB에 저장하는 것을 고려해야 할 유일한 이유는 IMO입니다. – peterchen

+0

나는 그럴만한 이유가 있다고 말하고 싶다. – ChaosPandion

3

db에 저장하면 db가 빠르게 커지고 훨씬 커집니다. db에 표시되는 이미지를 얻고 파일 시스템에서 가져 오는 것이 더 복잡합니다. 반면에 파일 이름과 경로가 db에 저장된 것과 동기화되지 않는지 확인하는 것이 좋습니다. 과거에는 db 대신 디스크에 저장하도록 선택했습니다. 데이터베이스를 다른 상자로 옮기는 것이 더 쉬워졌습니다. 잘 했어.

2

우리는 내가하고있는 프로젝트를 만들기 위해 비슷한 결정을했습니다. DB에 물건 (이미지 및 기타 BLOBy 물건)을 걸러내는 것에 대한 설득력있는 점은 누군가가 (의도적으로 또는 의도하지 않게) 삭제하거나 변경할 가능성이 적습니다. 그러나 그것이 우리가 선택한 선택이 아닙니다. 대신 DB에 저장된 경로 정보를 사용하여 UNC 경로를 통해 데이터를 참조합니다. 데이터 경로는 데이터의 위치를 ​​참조하는 부분과 해당 데이터 그룹이 속한 시스템을 가리키는 부분의 두 부분으로 저장됩니다. 데이터를 이동할 필요가있을 때 적절한 경로 정보를 업데이트 할 수 있습니다.

DB를 꺼내지 않고도 데이터를 빠르게 얻을 수 있습니다. 궁극적으로 그것은 중요한 결정 요인이었습니다.

4

사진을 웹 사이트로 만들려면 데이터베이스를 잊어 버리십시오. 인기가 높아지면 데이터베이스에 많은 피해를 입히고 대부분의 시간은 사진을 전달하는 데 소비됩니다. 또한 데이터베이스는 확장 성이 좋지 않습니다. 파일 시스템을 유지하는 데 훨씬 많은 이점이 있습니다. 또한 정적 컨텐츠 서버를 사용하여 컨텐츠 전달 서비스를 사용하여 확장 성을 향상시킬 수 있습니다.

또한 Amazon S3 또는 기타 클라우드 제공 업체는 장점이 있습니다. 예를 들어 S3 + Amazon CloudFront는 좋은 성능을 제공합니다. CloudFront는 전 세계의 서버에 파일을 캐시하므로 어느 곳에서나 쉽게/빠르게 액세스 할 수 있습니다. 그러나 우리가 사진을 말하고 사이트가 인기를 얻으면 귀하의 청구서가 상당히 클 수 있습니다.

스토리지 당 및 클라우드 내부/외부 전송 당 S3 Amazon charges의 경우. CloudFront per transfer에 대해

4

SQL Server 2008을 사용하는 경우 DB가 커지면서 언급되는 대부분의 문제를 처리하는 Filestream 데이터 형식이 있습니다. 그것은 파일 시스템과 테이블 간의 동기화에 관한 모든 성가신 세부 사항을 처리합니다. 주제에 대한 블로그 포스트 여기

봐 : Store any data in SQL Server 2008 (Katmai)

+0

그건 그렇고,이 게시물은 단지 정보 였어 ... :) – Siewers

관련 문제