2012-01-05 2 views
1

저는 Asp.Net MVC 웹 사이트를 만들고 있습니다.웹 사이트 용 SQL Server에 파일 (그림)을 저장하는 장단점

나는 과거에는 많은 애플리케이션을 위해 다중 레이어 애플리케이션에서 데이터베이스를 사용하여 파일을 저장했습니다.

하지만 지금은 스스로에게 질문하고 있습니다. 웹 사이트에 좋은 아이디어입니까? 실적보기에서?

그것은 나에게 몇 가지 장점이 있습니다

  • 연결된 사용자가 이미지를 표시 할 수있는 권리가있는 경우 우리가 일관성이 있는지 확인하기 위해 (내 프로젝트에 필요한) 쉽게
  • 허가를 제어 할 날 수 있습니다 데이터 (그렇지 않으면 기존 파일을 가질 수 있지만 데이터베이스에 정보가 없으면 그 반대 위치에 있습니다.
  • 장애 조치 웹 서버가 필요하며 이러한 파일을 세 번째 서버에서 가져 오므로 해당 파일이 데이터베이스에 있으면 장애 조치 서버에 ASP.Net 웹 사이트와 복제 데이터베이스가 필요하며 파일을 동기화 할 필요가 없습니다.

그러나 너무 몇 가지 단점이 있습니다

  • 이 1백~2백메가바이트 같은 몇 가지 큰 파일을 (이 소수이지만, 그것이 일어날 것이다), 그리고 나는 그것이 이것을 가지고 좋은 모르겠어요 데이터베이스에있는 파일의 종류 (질문과 비슷합니다.)
  • 좋은 성과를 거둘지 확신하지 못합니까?

어떻게 생각하십니까? 이게 합리적입니까? 인터넷에서 검색했지만 웹 사이트에 대한 몇 가지 주장을 찾지 못했습니다. 제 질문은 주로 FILESTREAM VS FILESYSTEM에 관한 것입니다. FileStream이 느리지 만 많은 부분이있을 것이라고 확신합니까? 왜냐하면 그것이 단지 몇 퍼센트 일 경우, 가치가있는 기능을 얻을 수 있기 때문입니다.

+0

200Mg는 작은 숫자이며, 일반적으로 2G +에 도달합니다. – Aristos

답변

3

파일이 통합적이고 활발히 변화하는 시스템 부분이며 다른 데이터와 함께 백업해야하는 경우 - 이지만 DB에 저장할 수 있습니다. SQL을 사용하는 경우 FILESTREAM 필드를 사용하십시오. 서버 2005+ 및 파일 크기가 너무 큼 - 예 : 500k +

파일이 정적 콘텐츠 인 경우 DB에 포인터 만 사용하여 외부에 저장할 수 있습니다. 이렇게하면 모든 사용자 지정 권한 컴퓨터를 고려하지 못할 수 있습니다.

DB 내부의 파일 저장 및 작업은 일반적으로 파일 시스템보다 느리지 만 필요에 따라 다릅니다.

+0

필자의 경우 업무 데이터가 많아서 (10-20 개 파일 (0.5-200MB, 대부분 파일이 2-3Mo가 될 것입니다) 프로 주간). 파일 스트림을 사용하는 것이 파일 시스템을 사용하는 것보다 얼마나 느린 지 알고 있습니까? – J4N

+1

filestream을 사용하는 것이 PROFILE을 사용하는 것이 파일 시스템을 사용하는 것보다 느리지는 않지만 순수 varbinary (최대) 열에 파일을 저장할 때 DB가 약간 느립니다. –

+1

이 비즈니스 데이터가 필요하면 항상 백업/복원 작업의 경우 다른 데이터와 동기화하십시오 -이 파일을 DB에 보관해야합니다. –

3

왜 txt 파일 대신 db를 사용합니까? 인덱스가 더 빠르기 때문에 인덱스를 사용합니다. db에 전체 파일을 저장하는 것은 결코 좋은 습관이 아닙니다. db를 일반 img 파일에 대한 색인 (포인터)으로 사용하십시오.

은 지금까지 당신의 전문가로/단점은 이동 :

  • 할 수 있습니다 쉽게 설정 제어 사용자가이 웹 외부 ASP/PHP로 이미지와 설정 루트 이미지 폴더를 표시하면 이미지를 볼 수있는 권리가있는 경우 당신은 DB에있는 파일이있는 경우

  • 당신이 늘 CDN 서비스를 사용할 수 있습니다 (HTTP - DB에 전체 파일을 저장하는 루트

  • 10 배 (http://blog.sitek.com.au/2008/03/comparison-between-storing-imagesfiles-in-mysql-and-on-filesystem/ 내가 MySQL의 테스트를 위해 알고 있지만 MSSQL에 대한 유사) 느린 CCA입니다 : //en.wi kipedia.org/wiki/Content_delivery_network는)

+0

큰 논쟁에 감사드립니다. 하지만 MySql과 MS SQL 사이에는 큰 차이가 있습니다. MS SQL에는 FILESTREAM 유형이 있습니다. 전문가는 BLOB 필드보다 훨씬 효율적이라고 가정합니다. (그리고 내 경우에는 해당 파일은 기록 된 유효 사용자 만 사용할 수 있습니다 (하나의 프로세스에서만 여기에있는 업무용이므로 CDN을 통해 사용할 수 없습니다) – J4N

+0

안녕하세요 Miha, 좀 더 자세히 설명해 주실 수 있습니까? 일반 img 파일에 대한 인덱스 (포인터)로 db를 사용하십시오. "라는 메시지를 디스크에 물리적으로 저장하고 DB에 저장하는 것을 의미합니까? " – Alok

+0

@ Alok - 대부분의 경우에 테이블을 사용하는 것이 가장 좋습니다 원하는 이미지를 빠르게 찾고 파일 시스템에 실제 이미지를 저장하기 위해 이미지 데이터 (제목, ID, 유형 등)를 저장하십시오. 여기에 대한 좋은 토론이 있습니다 : http://stackoverflow.com/questions/3748/storage-images-in-db-yea-or -nay –

6

To Blob or Not To Blob라는 마이크로 소프트 리서치 정말 좋은 종이있다.

성능 테스트 및 분석 많은 수의 후 그들의 결론은 이것이다 : 사진 또는 문서가 VARBINARY 컬럼이 더 효율적입니다 데이터베이스에 저장, 일반적으로 크기가 256K 이하 경우

  • 사진이나 문서의 크기가 일반적으로 1MB를 초과하는 경우 파일 시스템에 저장하는 것이 더 효율적입니다 (SQL Server 2008의 FILESTREAM 특성을 사용하면 여전히 트랜잭션 제어 및 데이터베이스의 일부인 것입니다)

  • 그 둘 사이에
  • , 그것은 동전 던지기의 비트들을 저장하기 위해

당신은 SQL Server 테이블에 사진을 넣어하기로 결정하는 경우

, 나는 강력하게 별도의 테이블을 사용하는 것이 좋습니다 것입니다 귀하의 사용에 따라입니다 그림 - 직원 사진에 직원 사진을 저장하지 마십시오. 별도의 테이블에 보관하십시오. 이렇게하면 Employee 테이블은 항상 직원의 foto를 쿼리의 일부로 선택할 필요가 없다고 가정 할 때 간결하고 평균적이며 매우 효율적입니다.

파일 그룹의 경우 소개를 보려면 Files and Filegroup Architecture을 확인하십시오. 기본적으로 대용량 데이터 구조를위한 별도의 파일 그룹을 사용하여 처음부터 데이터베이스를 만들거나 나중에 추가 파일 그룹을 추가 할 수 있습니다. "LARGE_DATA"라고합시다. 당신은 VARCHAR (MAX) 또는 VARBINARY (MAX) 열을 저장해야 만들 수있는 새 테이블있을 때마다

이제

, 당신은 큰 데이터를이 파일 그룹을 지정할 수 있습니다

CREATE TABLE dbo.YourTable 
    (....... define the fields here ......) 
    ON Data     -- the basic "Data" filegroup for the regular data 
    TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

체크 아웃 MSDN에서 파일 그룹을 소개하고 함께 놀아 라!

+0

필자의 경우,이 필드는 일부 메타 데이터 (이름, 크기) 만있는 "파일"테이블에 저장되므로이 필드를 th 같은 테이블. 당신은 나에게 많은 좋은 의견을 주지만, 실제로는 파일 스트림과 파일 시스템 중 하나를 선택하는 데 도움이되지 않습니다. 링크가 BLOB 대 파일 시스템 (매우 유용한 BTW)을 비교하고 있기 때문입니다. – J4N

+0

@marc_s : 좋은 연구 논문 +1 –

관련 문제