2009-07-03 2 views
4

우리는 ASP.Net 상점 구현을 단순한 것에서부터보다 유연한 구조로 업그레이드하고 있습니다. 나는 제품과 관련된 이미지를 저장하는 몇 가지 옵션을 찾고있다. (이미지의 두 가지 유형, 제품의 엄지 손가락 및 제품의 전체보기 이미지가 있습니다). 수백 가지 이상의 제품을 처리해야합니다. DB에
1) 매장 이미지 - 이미지)
프로
을 IHttpHandler를 사용하여 표시 (다음 이미지로 스트림으로 DB에서로드 - 그 자체가 이미지를 :asp.net 응용 프로그램의 이미지를 어떻게 저장합니까?

는 지금까지 약 2 옵션을 생각하고 우리가
뒤에 코드에서 작업하는 클래스, 비즈니스 오브젝트의 일부 - 제품 데이터를 유지하기 위해 한 곳
단점
- 메모리 소비 - 트래픽 증가 우리는 제품 데이터 FR를 얻을로 톰 다른 API

2) 파일 시스템에 이미지를 저장 - 이미지 링크
프로로 페이지에 배치됩니다은
-이 세션에 저장되지 않는 메모리에 전혀 영향, 응용 프로그램 cache.It 간단한처럼 사용된다 링크
- 아니 메모리 소비
단점
는 - 파일 시스템의 이미지에 대한 몇 가지 이름 규칙 (심지어 일부 폴더 구조)을 유지하기 위해 필요
- 이미지

의 더 복잡한 유지 보수

다른 적합한 메커니즘이 있습니까? 사용할 조언은 무엇입니까?

필자는 개인적으로 파일 시스템에서 이미지를 선호하지만 두 개의 별도 위치가 있으므로 이미지를 유지하는 것이 더 어려울 수 있습니다.

모든 의견을 주셔서 감사합니다. X.

BTW : 어떤 단계에서 제품에 동영상이나 다른 미디어도 함께 표시해야한다고 상상할 수 있습니다. 이 경우 Db는 실제로 옵션이 아닙니다. 그렇지 않습니까?

답변

4

나는 이와 비슷한 시스템을 만들었습니다. 제 생각에는 페이지로드 속도가 다른 모든 고려 사항보다 우선하기 때문에 '디스크에 이미지 저장'옵션을 사용했습니다.

이미지가 시스템에 추가되면 원래 이미지가 잘리고 원하는보기 크기로 조정되어 축소판도 생성됩니다. 3 개의 이미지가 원판, 디스플레이 크기 및 썸네일로 디스크에 저장됩니다. 각 파일 이름에 대해 생성 된 GUID가 있습니다.

(아마존에서 쇼핑하는 것을 상상해보십시오. 제품 목록을 볼 때만 축소판 그림이 표시됩니다. 제품을 검사 할 때 디스플레이 크기가 표시되고 이미지를 다시 클릭하면 전체 크기를 볼 수 있습니다.)

저는 이처럼 약간 보인 데이터베이스 테이블을 가졌습니다.

ID    int, PK 
FullSizePath  varchar(128) 
DisplaySizePath varchar(128) 
ThumbNailPath  varchar(128) 
OriginalData  BLOB 

나는 파일 서버에 사고가 있었다 단지 넣는다 DB에 원본 데이터를 보관하고 이미지가 삭제되었다, 그래서 그들은 모두 다시 생성 할 수 있습니다. 그러나이 데이터는 페이지 요청 중에 db에서 가져 오지 않습니다.

+0

나는 비슷한 견해를 가지고 있습니다. 나는 우리가 이런 식으로 들어가는 것 같아. 그냥 우리가 백업을 사용할 수있는 것처럼 원래 이미지를 DB에 저장하는 것이 여전히 과도하다고 생각합니까? 아마도 –

+2

. 백업 솔루션에 따라 다릅니다. 우리 웹 서버에있는 파일들은 백업되지 않았으며 대신 소스 제어에 있습니다. 그러나 우리 데이터베이스는 야간에 백업되므로 db와 같은 원본을 유지하는 것이 더 합리적입니다. – Kirschstein

+1

나는 최근에 비슷한 API를 구현해야했고, 이것이 내가 고려하고있는 계획을 확인했다. 그러나 나는 이미지를 최적화하고 서버에 여러 크기를 만드는 것에 대해 생각하지 않았습니다 ... 정말 멋지 네요! 좋은 아이디어를 가져 주셔서 감사합니다! –

0

아무 것도 다루지 않았 겠네요. 주 이미지를 filesystem/db에 저장할 수 있지만 프로그램 적으로 미리보기 이미지를 생성 할 수 있으므로 디스크 공간이 줄어들 수 있습니다.

1

내가 둘의 혼합물이 작은 중요한 이미지 DB에 대한 가장 입니다 바람직하다 양과 크기의 파일 시스템에 큰 위해 생각 나는 우리가 저장하는 경향이 일을 당신의 예와 같은 경우에

+0

두 가지 방법을 섞으면 문제가 생기고 더 많은 문제가 발생할 수 있습니다. 어쨌든 코멘트를 주셔서 감사합니다. –

0

더 나은 디스크의 이미지를 찾은 다음 파일 이름을 db에 기록하십시오.

다음 제품의 DB가 있으면 제품을 검색하여 동적으로 이미지를로드 할 수 있습니다.

제품을 추가/제거/편집 할 수있는 관리 시스템을 사용하고 계신다면 매우 좋습니다.

두 가지 원본 제안 사이에 종류가 있다고 가정하면 원하는 경우 모든 이미지를 같은 디렉토리에 저장할 수도 있습니다.

+0

이름에 어떤 규칙이 사용됩니까? (Guid 또는 productname + index + suffix, prefix?) 연결이 끊어져서 몇 가지 문제가 있습니까? 아니면 다른 문제일까요? –

+0

우리는 파일 이름과 ID (그리고 너비와 높이 같은 다른 정보를 더하기도 함)를 포함하는 이미지 테이블을 가지고 있으므로 저장 프로 시저와 같은 모든 이미지는 ID로 참조됩니다. 이미지 자체의 이름을 지정하면 모든 축소판에 small_ 접두사가 붙지 만 그렇지 않으면 파일 이름이 변경되지 않습니다. 관리 시스템을 통해 추가 된 제품의 경우 이미지 업로드 부분에서 중복을 확인합니다. 이미지 GUID에 이미지 GUID를 추가하는 것이 더 좋을 수도 있지만 문제는 아닙니다. 제품에 대해 sp를 실행하면 링크 된 이미지의 파일 이름을 검색 할 수 있습니다. – RYFN

+0

(죄송합니다, walloftext!) 잃어버린 링크는 우리에게는 문제가되지 않았지만 데이터베이스를 옮기거나 테이블에 ID를 재설정하는 경우에 발생할 수 있습니다. 실제로 잘 작동합니다. 가장 약한 링크는 이미지 업로드 및 크기 조정에 사용되는 구성 요소입니다. 모든 제품 이미지가 동일한 이미지 폴더에있는 경우에도 webconfig에 경로를 유지할 수 있습니다. – RYFN

0

MS SQL 2008을 사용하는 경우 FILESTREAM feature에 대한 옵션이 있습니다.

여기에 요점입니다,하지만 당신은 전체 백서 읽어야

FILESTREAM은 SQL 서버 2008 릴리스의 새로운 기능입니다. 구조화 된 데이터를 데이터베이스에 저장하고 관련 구조화되지 않은 (즉 BLOB) 데이터를 NTFS 파일 시스템에 직접 저장할 수 있습니다. 그런 다음 은 고성능 BLOB 데이터를 SQL Server를 통해 액세스 할 때 성능 저하를 지불하지 않고도 고성능 Win32® 스트리밍 API를 통해 BLOB 데이터에 액세스 할 수 있습니다.

FILESTREAM도 로그 백업을 사용 FILESTREAM 데이터의 시점 복구를 허용 항상 구조화 구조화 데이터 간의 트랜잭션 일관성을 유지한다. 일관성은 에 의해 SQL Server에 의해 자동으로 유지되며 은 응용 프로그램에서 사용자 지정 논리를 필요로하지 않습니다. (이 백서의 "구성 FILESTREAM 가비지 컬렉션 (Garbage Collection)"섹션 이상에서 자세한 설명) 같은 관리 요구 사항의 많은있는 데이터베이스의 트랜잭션 로그의 상당을 유지하여이를 수행 FILESTREAM 메커니즘 . 데이터베이스의 트랜잭션 로그와 FILESTREAM 트랜잭션 로그의 조합을 사용하면 FILESTREAM 및 구조화 된 데이터를 트랜잭션으로 올바르게 복구 할 수 있습니다.

관련 문제