SQL Server에 이미지를 저장 하시겠습니까?


191

작은 데모 사이트를 만들었고 SQL 서버의 이미지 열 내에 이미지를 저장하고 있습니다. 내가 가진 몇 가지 질문은 ...

  • 이것은 나쁜 생각입니까?

  • 사이트가 커지면 내 사이트의 성능에 영향을 줍니까?

대안은 이미지를 디스크에 저장하고 이미지에 대한 참조 만 데이터베이스에 저장하는 것입니다. 이것은 많은 사람들이 겪은 일반적인 딜레마 여야합니다. 나는 충고를 환영하며 실제로 가능하다면 실수를 덜게되어 기쁘다.


5
2017 년에이 문제점에 대한 새로운 추가 사항이 있습니까? 이것이 오늘날에도 유효합니까?
Haikal Nashuha

답변:


272

Microsoft Research의 To Blob 또는 Not To Blob 이라는 훌륭한 문서가 있습니다.

많은 성능 테스트 및 분석 후의 결론은 다음과 같습니다.

  • 사진이나 문서의 크기가 일반적으로 256KB 미만인 경우 데이터베이스 VARBINARY 열에 저장하는 것이 더 효율적입니다

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

  • 그 둘 사이에, 그것은 당신의 사용에 따라 약간 던지기입니다

그림을 SQL Server 테이블에 저장하기로 결정한 경우 해당 사진을 저장하기 위해 별도의 테이블을 사용하는 것이 좋습니다. 직원 테이블에 직원 사진을 저장하지 말고 별도의 테이블에 보관하십시오. 이런 식으로 직원 테이블을 쿼리의 일부로 직원 사진을 항상 선택할 필요가 없다고 가정하면 직원 테이블은 간결하고 의미 있고 매우 효율적일 수 있습니다.

파일 그룹의 경우 파일 및 파일 그룹 아키텍처 에서 소개를 확인하십시오. 기본적으로 처음부터 큰 데이터 구조를 위해 별도의 파일 그룹으로 데이터베이스를 만들거나 나중에 추가 파일 그룹을 추가합니다. "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 소개를 확인하고 함께 사용해보십시오!


이것이 좋은지 나쁜지 .... • 사진이나 문서의 크기가 일반적으로 1MB를 초과하면 파일 시스템에 저장하는 것이 더 효율적입니다 (그리고 SQL Server 2008의 FILESTREAM 특성을 사용하면 여전히 트랜잭션 제어 상태에 있습니다) 및 데이터베이스의 일부)
htm11h

좋은 대답입니다. 이미지 데이터에 전용 테이블을 사용하도록 권장하는 이유 를 자세히 설명하고 싶은 경우 dba.SE에 대해 별도의 질문을 작성했습니다 .
Heinzi

15

나는이 딜레마에 빠졌고 의견을 찾기 위해 Google에서 상당히 연구했습니다. 내가 찾은 것은 실제로 많은 사람들이 더 큰 이미지를 위해 디스크에 이미지를 더 잘 저장한다는 것을 알았으며 mySQL을 사용하면 특히 PHP와 같은 언어에서 더 쉽게 액세스 할 수 있습니다.

비슷한 질문을 찾았습니다

작은 PNG 이미지 저장을위한 MySQL BLOB vs 파일?

내 마지막 평결은 프로필 사진과 같은 것, 사용자 당 필요한 작은 정사각형 이미지의 경우 mySQL은 hdd에 많은 엄지 손가락을 저장하는 것보다 낫지 만 사진 앨범 및 폴더의 경우 폴더 / 이미지 파일이 더 좋습니다.

그것이 도움이되기를 바랍니다.


14

이미지를 디렉토리에 저장 한 다음 이미지 파일에 대한 참조를 데이터베이스에 저장하는 것을 선호합니다.

그러나 이미지를 데이터베이스에 저장하는 경우 이미지 열이 별도의 파일에 있도록 데이터베이스를 분할해야합니다.

파일 그룹 사용에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/ms179316.aspx를 참조 하십시오 .


11

웹 서버의 카탈로그가 아닌 데이터베이스에 그림을 저장하는 것이 좋은 이유는 무엇입니까?

클라이언트가 수년간 사용했던 서버의 폴더에 많은 그림이 저장된 응용 프로그램을 만들었습니다.

이제 그들은 당신에게 온다. 서버가 손상되었으므로 새 서버에서 복원해야합니다. 더 이상 이전 서버에 액세스 할 수 없습니다. 그들이 가진 유일한 백업은 데이터베이스 백업입니다.

물론 원본이 있으며이를 새 서버에 간단하게 배포하고 SqlServer를 설치하고 데이터베이스를 복원 할 수 있습니다. 그러나 이제 모든 사진이 사라졌습니다.

SqlServer에 그림을 저장 한 경우 모든 것이 이전과 같이 작동합니다.

그냥 내 2 센트.


3
좋은 지적. 이미지 백업은 데이터베이스 백업만큼 중요하며 때로는 더 중요합니다.
크리스 카티 냐니

또한 파일 시스템의 이미지에도 네트워크 권한이 필요합니다.
크리스 카티 냐니

2
네트워크 권한이 좋습니다. 그러나 DB의 백업 만 가지고있는 경우는 보이지 않습니다. 반드시 응용 프로그램과 파일을 백업해야합니다. DB를 쉽게 잃을 수는 있지만 파일을 가질 수 있습니다.
Norbert Norbertson 2018 년



7

성능 문제는 유효하지만 실제로 데이터베이스에 이미지를 저장하지 않아야하는 실제 이유는 데이터베이스 관리 이유입니다. 데이터베이스는 매우 빠르게 성장하고 데이터베이스는 단순한 파일 스토리지보다 훨씬 비쌉니다. 데이터베이스 백업 및 복원은 파일 백업 복원보다 훨씬 비싸고 시간이 많이 걸립니다. 한 번에 이미지가있는 데이터베이스보다 작은 데이터베이스를 훨씬 더 빠르게 복원 할 수 있습니다. Azure에서 1TB의 파일 저장소를 1TB 데이터베이스와 비교하면 비용에 큰 차이가 있습니다.


0

내 경험상 다른 위치에 저장된 이미지의 URL에 저장하는 것이 간단한 프로젝트의 가장 좋은 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.