2010-04-28 2 views
5

ASP.NET MVC + NHibernate + Postres 스택을 사용하여 웹 응용 프로그램을 작성하고 있습니다. 업로드 된 이미지가 바이너리 블롭 (blob) 또는 파일 시스템 (및 db 만 참조)으로 데이터베이스에 저장되어야하는지 궁금합니다. db 저장소의 장점은 파일 시스템 복사 도구로 돌아 가지 않고도 모든 데이터를 쉽게 백업/복구 할 수 있다는 것입니다. 반면에 나는 파일 시스템 접근이 더 빠를 것이라고 생각한다. (특히 많은 동시 요청을 다룰 때 그렇다.) 당신의 제안은 무엇인가?ASP.NET MVC 이미지 업로드 저장소 위치 (db vs filesystem)

+2

중복 가능한 http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – Cesar

+1

특수 CDN 서버에 있으십니까? – Paco

답변

2

이미지를 데이터베이스에 저장하여 모든 데이터를 중앙 집중식으로 백업 할 수 있도록합니다.하지만 외부에서 데이터를 캐시하여 큰 이미지에 대한 반복 요청이 버퍼 캐시를 스레 싱하지 않도록하십시오. 데이터베이스 제대로 완료되면, 시작한 후에 데이터베이스에서 로컬 이미지 캐시를 투명하게 채울 새로운 프론트 엔드 웹 서버를 가져올 수 있습니다.

이미지의 중앙 저장소를 사용하면 여러 웹 서버가있는 시스템의 이미지에 대해 최종 수정 및 ETag HTTP 응답 헤더를 보낼 때 유용합니다. 이러한 헤더는 촬영하지 않고 데이터베이스 내용으로 만들 수 있기 때문에 유용합니다. 로컬 캐시 개체에서.

특별히 PostgreSQL 구현 노트 : 이미지 데이터가 포함 된 열의 "저장 모드"를 "외부"로 설정할 수 있습니다. 이렇게하면 PostgreSQL이 이미지 데이터 압축을 중지합니다 (zlib을 사용하지 않습니다. 이미지 데이터를 보조 TOAST 테이블에 저장하도록하여 이미지 메타 데이터를 쿼리하는 경우 더 나은 성능을 제공합니다. 우리는 백업 데이터베이스에 원본의 스토리지를 사용하지만 웹 서버에 파일 시스템에 캐시 이미지를 축소 생성 된 ALTER TABLE 명령의 "SET의 저장"절, 예컨대 :

ALTER TABLE media.image ALTER COLUMN content SET STORAGE EXTERNAL 
1

에 따라 다릅니다. 이미지에 직접 링크 할 수 있다는 가치를 지니고 있습니까? 아니면 항상 DB를 호출하기 위해 서버 측 리소스를 사용하고 이미지의 바이너리 데이터를 작성하고 싶습니까?

2

를 참조하십시오.

그러나 한 페이지가 일반적으로 페이지 뷰 당 여러 이미지 요청을 호출하기 때문에 큰로드가 발생하므로 가능하면 데이터베이스 왕복을 피하십시오.

blob을 데이터베이스에 저장하는 것에 대한 한 가지 메모는 엔티티/엔티티에 일대일 매핑을 사용하여 전용 테이블에 실제 BLOB 열을 저장하는 것이 좋습니다. 이렇게하면 백업을 쉽게하고 테이블을 쉽게 변경할 수 있습니다. 테이블이 커지면 변경 사항이 "영원히"완료되어 백업이 진행되는 동안에도 잠금이 큰 문제가됩니다.

바이너리 데이터가 필요하지 않는 한 해당 데이터를 선택하는 이미지 (바이너리 데이터 제외)에 대한 모든 정보가있는 경우 영향을받지 않습니다 (파일 시스템에 캐시되므로 거의 필요하지 않음).

그냥 내 두 센트.

+0

다른 데이터베이스는 blob을 저장하는 다른 접근법을 가지고 있습니다. postgresql은 큰 bytea 값을 별도의 "toast"테이블에 자동으로 저장하므로이를 명시 적으로 수행 할 필요가 없습니다. – araqnid

+0

사실, 이미지 데이터를 저장하기 위해서는 항상 "alter table ... alter column ... alter storage external"명령을 사용하여 항상 라인 외부에 저장하고 압축을 사용하지 않는 것이 좋습니다. – araqnid

+0

흠, 그건 우리가 postgres를 사용하기 때문에 이상하네요. 그리고 테이블을 바꿔서 백업 할 때 테이블 잠금에 문제가 있습니다. – jishi