DB에 이미지 저장-예 또는 아니요?


415

그래서 DB에 이미지를 많이 저장하는 앱을 사용하고 있습니다. 이것에 대한 당신의 전망은 무엇입니까? 위치를 DB에 직접 저장하는 것보다 파일 시스템에 위치를 저장하는 유형에 가깝습니다.

장단점은 무엇이라고 생각하십니까?


트랜잭션 디스크 캐시로 두 가지 모두 수행 할 수 있습니다 .
Lilith River

답변:


350

많은 TB 이미지를 관리하는 일부 응용 프로그램을 담당하고 있습니다. 데이터베이스에 파일 경로 를 저장하는 것이 가장 좋습니다.

몇 가지 문제가 있습니다.

  • 데이터베이스 스토리지는 일반적으로 파일 시스템 스토리지보다 비쌉니다.
  • 표준 제품으로 표준 파일 시스템 액세스를 가속화 할 수 있습니다
    • 예를 들어, 많은 웹 서버는 운영 체제의 sendfile () 시스템 호출을 사용하여 파일을 파일 시스템에서 네트워크 인터페이스로 비동기식으로 직접 보냅니다. 데이터베이스에 저장된 이미지는이 최적화의 이점을 얻지 못합니다.
  • 웹 서버 등과 같은 것은 파일 시스템의 이미지에 액세스하기 위해 특별한 코딩이나 처리가 필요하지 않습니다.
  • 데이터베이스는 이미지와 메타 데이터 간의 트랜잭션 무결성이 중요한 곳에서 승리합니다.
    • db 메타 데이터와 파일 시스템 데이터 간의 무결성을 관리하는 것이 더 복잡합니다
    • 데이터가 파일 시스템의 디스크로 플러시되는 것을 보장하는 것은 (웹 응용 프로그램의 컨텍스트 내에서) 어렵다

33
파일 시스템을 "초고속으로"사용할 수있는 기성품은 무엇입니까?
Andrei Rînea

22
3TB의 파일 만 관리하지만 동의합니다. 데이터베이스는 Blob이 아닌 구조화 된 데이터를위한 것입니다.
derobert

7
@derobert : 아주 그렇습니다. 쿼리에서 데이터 요소를 조건이나 조인으로 절대 사용하지 않으면 데이터베이스에 속하지 않을 것입니다. 그럼 다시, 당신은 형상에 대한 검색 이미지에 좋은 데이터베이스 기능 ...이있는 경우
닐스 Weinander

14
파일 시스템을 "초고속으로"사용할 수있는 기성품은 무엇입니까?
ablmf

5
Re : "최고 가속화"제품 : 대부분의 웹 서버는 sendfile () 시스템 호출을 이용하여 정적 파일을 클라이언트에 비동기 적으로 전달할 수 있습니다. 디스크에서 네트워크 인터페이스로 파일을 이동하는 작업을 운영 체제에 오프로드합니다. OS는 커널 공간에서 훨씬 효율적으로이 작업을 수행 할 수 있습니다. 이것은 나에게 이미지 저장 / 제공에 대한 파일 시스템 대 db의 큰 승리처럼 보입니다.
Alan Donnelly

140

대부분의 문제와 마찬가지로 들리는 것처럼 간단하지 않습니다. 데이터베이스에 이미지를 저장하는 것이 적합한 경우가 있습니다.

  • 인보이스와 같이 동적으로 변경되는 이미지를 저장하고 있고 2007 년 1 월 1 일과 같이 인보이스를 받으려고하십니까?
  • 정부는 당신이 6 년의 역사를 유지하기를 원합니다
  • 데이터베이스에 저장된 이미지에는 다른 백업 전략이 필요하지 않습니다. 파일 시스템에 저장된 이미지는
  • 이미지가 데이터베이스에있는 경우 이미지에 대한 액세스를 제어하기가 더 쉽습니다. 유휴 관리자는 디스크의 모든 폴더에 액세스 할 수 있습니다. 이미지를 추출하기 위해 실제로 관리자가 데이터베이스에서 스누핑을 수행해야합니다.

반면에 관련된 문제가 있습니다

  • 이미지를 추출하고 스트리밍하려면 추가 코드가 필요합니다.
  • 대기 시간은 파일 직접 액세스보다 느릴 수 있습니다.
  • 데이터베이스 서버에 더 많은로드

2
온 프레미스 (예 : SharePoint)에 설치된 응용 프로그램을 작성할 때 별도의 백업 전략이 없으면 큰 문제가 될 수 있습니다. SharePoint 백업을 만들면 모든 것이 DB에 있으므로 매우 쉽습니다.
Eric Schoonover

44
모호한 보안은 실제로 액세스 제어 전략이 아닙니다!
Jon Cage

5
나는 그가 모호함으로 보안을 옹호한다고 생각하지 않습니다. 그는 DB에 이미지를 넣는 것이 또 다른 보안 계층을 추가한다고 말합니다. (제 생각에는 @Conrad, 입에 단어를 넣고 싶지 않습니다)
AJ.

단일 백업 이점 (또는 일반적으로 말하면 모든 데이터를 한곳에 저장) 때문에 데이터베이스에 이미지 저장을 선택했지만 언급 한 문제도 마찬가지이므로 파일 시스템에 이미지를 캐시합니다. 그것은 두 세계의 최고이며, 여기에 언급 된 최고의 답변이 없다는 것에 놀랐습니다.
바트 반 Heukelom

우연히 ImageResizing.Net 라이브러리를 사용하여 SQL-> 디스크 이미지 캐싱을 처리하고 있습니까? 가장 진보적이고 확장 가능하며 강력한 디스크 캐시입니다.
Lilith River


56

약간 긴 시간이 걸릴 수 있지만 SQL Server 2008을 사용하거나 사용하려는 경우 새로운 FileStream 데이터 형식을 살펴 보는 것이 좋습니다 .

FileStream은 파일을 DB에 저장하는 것과 관련된 대부분의 문제를 해결합니다.

  1. Blob은 실제로 폴더에 파일로 저장됩니다.
  2. 블롭을 사용하여 액세스 할 수 있습니다 데이터베이스 연결 또는 파일 시스템을 통해합니다.
  3. 백업이 통합되었습니다.
  4. 마이그레이션은 "그냥 작동"

그러나 SQL의 "투명한 데이터 암호화"는 FileStream 객체를 암호화하지 않으므로 고려해야 할 경우이를 varbinary로 저장하는 것이 좋습니다.

MSDN 기사에서 :

Transact-SQL 문은 FILESTREAM 데이터를 삽입, 업데이트, 쿼리, 검색 및 백업 할 수 있습니다. Win32 파일 시스템 인터페이스는 데이터에 대한 스트리밍 액세스를 제공합니다.
FILESTREAM은 파일 데이터 캐싱에 NT 시스템 캐시를 사용합니다. 이는 FILESTREAM 데이터가 데이터베이스 엔진 성능에 미치는 영향을 줄이는 데 도움이됩니다. SQL Server 버퍼 풀이 사용되지 않습니다. 따라서이 메모리는 조회 처리에 사용 가능합니다.


FileStream의 경우 +1 실제로 Blob을 디스크에 파일로 저장하지만 트랜잭션으로 관리합니다.
John Gietzen

또한 SQL 서버를 사용하면 FileStream Blob이 디스크에서 직접 액세스 할 수 있으므로 DB 연결을 피할 수 있습니다.
John Gietzen

여전히 DB와 웹 서버 사이에 지연 시간이 추가되었습니다. 디스크 캐싱을 사용하지 않는 한 웹 서버는 디스크에서 스트리밍 할 수있는 대신 클라이언트로 스트리밍하기 위해 메모리에로드해야합니다.
Lilith River

39

DB의 파일 경로는 분명히 갈 길입니다-TB 이미지를 가진 고객으로부터 많은 이야기를 들었습니다 .DB에 상당한 양의 이미지를 저장하려고하는 악몽이되었습니다.


35

내 경험상 때로는 가장 간단한 해결책은 기본 키에 따라 이미지 이름지정하는 것 입니다. 따라서 특정 레코드에 속하는 이미지를 쉽게 찾을 수 있으며 그 반대도 마찬가지입니다. 그러나 동시에 데이터베이스의 이미지에 대해서는 아무것도 저장하지 않습니다 .


정말 좋습니다. 사용자는 이제 다른 파일에 액세스하기 위해 파일 이름을 쉽게
늘릴 수

6
@Marijn : 이미지를 세계에 노출시키는 경우에만 해당됩니다.
Seun Osewa

이미지화 된 문서와 매우 유사한 작업을 수행했지만 (기본 키는 3 가지 항목의 복합 키입니다.) 동일한 디렉토리에 여러 버전이있을 수 있도록 문서를 스캔 한 날짜와 시간을 추가했습니다.
Andrew Neely

@ 오세와 어때요? 예, 파일에 직접 액세스하려면 최종 사용자가 폴더에 액세스해야합니다. 요청에 따라 FTP를 통해 파일을 제공하는 프로세스를 가질 수 있으며 보안은 SQL 서버와 동등합니다.
Andrew Neely

31

여기서 속임수는 열성적이지 않는 것입니다.

여기서 주목해야 할 것은 프로 파일 시스템 캠프에 아무도 특정 파일 시스템을 나열하지 않았다는 것입니다. 이것은 FAT16에서 ZFS에 이르는 모든 것이 모든 데이터베이스를 능가한다는 것을 의미합니까?

아니.

진실은 우리가 원시 속도에 대해서만 이야기 할 때조차도 많은 데이터베이스가 많은 파일 시스템을 능가한다는 것입니다.

올바른 행동 과정은 정확한 시나리오에 대한 올바른 결정을 내리는 것이며,이를 위해서는 몇 가지 숫자와 사용 사례가 필요합니다.


6
파일 시스템이 DB의 100 %보다 빠르다고 주장하는 사람은 없습니다 (Mark Harrison의 답변 읽기). 그것은 약간의 밀짚 꾼입니다. 안전 벨트를 착용하지 않는 것이 바람직하지만 일반적으로 안전 벨트를 착용 하는 것이 좋습니다.
Calvin

30

참조 무결성 및 ACID 준수를 보장해야하는 장소에서는 데이터베이스에 이미지를 저장해야합니다.

데이터베이스에 저장된 해당 이미지의 이미지와 메타 데이터가 동일한 파일을 참조한다는 것을 트랜잭션 분석적으로 보증 할 수 없습니다. 다시 말해, 파일 시스템의 파일이 메타 데이터와 동일한 트랜잭션에서 동시에 변경되는 것을 보장 할 수는 없습니다.


7
실제로는 할 수 없습니다. 이미지 파일이 삭제, 변경 또는 덮어 쓰기 된 적이없는 한 트랜잭션을 커밋하기 전에 모든 이미지 파일이 동기화되고 파일 시스템이 손상되지 않으며 이미지 파일과 메타 데이터가 동기화되어 있는지 확인할 수 있습니다. 일부 응용 프로그램의 경우 너무 많은 경우가 있습니다.
Seun Osewa 1

더 나아가 저널링 파일 시스템과 일부 추가 프로그램 논리를 사용하면 ACID 준수를 달성 할 수 있다고합니다. 단계는 DB 레코드를 작성하고 파일을 작성하는 것입니다. 파일이 커밋되면 db 트랜잭션을 커밋하십시오.
Andrew Neely

28

다른 사람들이 말했듯이 SQL 2008에는 파일 스트림 유형이 제공되어 파일 이름 또는 식별자를 db에 포인터로 저장하고 파일 시스템에 이미지를 자동으로 저장할 수 있습니다. 이는 훌륭한 시나리오입니다.

오래된 데이터베이스를 사용하는 경우 BLOB 데이터로 저장하는 경우 기능 검색 방법으로 데이터베이스에서 아무것도 가져 가지 않을 것이므로 아마도 가장 좋습니다. 파일 시스템에 주소를 저장하고 이미지를 그런 식으로 저장합니다.

이렇게하면 파일 시스템의 공간 또는 압축 된 공간 만 절약하므로 파일 시스템의 공간도 절약 할 수 있습니다.

또한 db 적중없이 파일 시스템의 원시 이미지를 탐색하거나 파일을 다른 시스템, 하드 드라이브, S3 또는 다른 시나리오로 대량 전송하여 위치를 업데이트 할 수있는 구조 또는 요소를 저장하기로 결정할 수 있습니다 저장 공간을 늘리려 고 할 때 이미지를 DB에서 가져 오려고 시도하지 않고 다시 구조를 유지하십시오.

아마 그것은 일반적으로 히트 이미지 URL을 기반으로 웹 엔진 / 프로그램에 일부 캐싱 요소를 던져서 거기에 자신을 저장하게 할 수도 있습니다.


27

자주 편집되지 않는 작은 정적 이미지 (2 메가 이하)는 데이터베이스에 저장해야합니다. 이 방법에는 이식성 (이미지가 데이터베이스와 함께 전송 됨), 백업 / 복원 (이미지가 데이터베이스와 함께 백업 됨), 확장 성 (수천 개의 작은 썸네일 파일이있는 파일 시스템 폴더)이 확장 성 악몽처럼 들리는 등 여러 가지 이점이 있습니다. 나를).

데이터베이스에서 이미지를 제공하는 것은 쉽습니다. DB 서버에서 반환 된 바이트 배열을 이진 스트림으로 제공하는 http 핸들러를 구현하기 만하면됩니다.


일관성이 문제가 될 수 있기 때문에 데이터베이스를 자주 편집하는 파일에 더 적합하다고 주장합니다.
Seun Osewa 1

26

주제에 대한 흥미로운 백서가 있습니다.

BLOB로 또는 BLOB으로 : 데이터베이스 또는 파일 시스템의 대형 객체 저장소

대답은 "그것은 달려있다"입니다. 확실히 그것은 데이터베이스 서버와 Blob Storage에 대한 접근 방식에 달려 있습니다. 또한 Blob에 저장되는 데이터 유형과 해당 데이터에 액세스하는 방법에 따라 다릅니다.

데이터베이스를 스토리지 메커니즘으로 사용하여 더 작은 크기의 파일을 효율적으로 저장하고 전달할 수 있습니다. 더 큰 파일은 파일 시스템을 사용하여 저장하는 것이 좋으며, 특히 자주 수정 / 업데이트되는 경우에 특히 좋습니다. (블로 브 조각화는 성능과 관련하여 문제가됩니다.)

명심해야 할 추가 사항이 있습니다. Blob을 저장하기 위해 데이터베이스 사용을 지원하는 이유 중 하나는 ACID 준수입니다. 그러나 SQL Server 처리량을 두 배로 늘리는 백서 (SQL Server의 대량 로깅 옵션)에서 테스터가 사용한 접근 방식은 BLOB 데이터가 기록되지 않았기 때문에 ACID의 'D'를 'd'로 효과적으로 변경했습니다. 트랜잭션의 초기 쓰기 따라서 전체 ACID 준수가 시스템에 중요한 요구 사항 인 경우 파일 I / O를 데이터베이스 Blob I / O와 비교할 때 데이터베이스 쓰기에 대한 SQL Server 처리량 수치를 절반으로 줄이십시오.


25

아직 아무도 언급하지 않았지만 주목할 가치가있는 한 가지는 대부분의 파일 시스템에 많은 양의 이미지를 저장하는 것과 관련된 문제가 있다는 것입니다. 예를 들어 위에서 언급 한 접근 방식을 취하고 기본 키 다음에 각 이미지 파일의 이름을 지정하는 경우 대부분의 파일 시스템에서 매우 많은 수의 이미지에 도달하면 모든 이미지를 하나의 큰 디렉토리에 넣으려고하면 문제가 발생합니다 ( 예를 들어 수십만 또는 수백만에서).

이것에 대한 일반적인 해결책은 균형 잡힌 하위 디렉토리로 해시하는 것입니다.


그렇게 생각 하겠지만 문제는 실제로 사소한 것입니다. 한 디렉토리에 수백만 개의 파일이있는 앱이 있으며 수백 명의 사용자가 문제없이 액세스 할 수 있습니다. 똑똑하지는 않지만 작동합니다. 가장 큰 문제는 탐색기를 사용하여 디렉토리를 탐색하면 손전등을 영원히 보는 것입니다.
SqlACID

1
큰 디렉토리에는 문제가없는 파일 시스템을 사용하는 것이 좋습니다.
Seun Osewa

8
하나의 디렉토리 (RHEL 4를 실행하는 서버)에 수백만 개의 파일이있는 앱이 있습니다. 디렉토리 내용 (파일에 파이핑)을 나열하는 데 며칠이 걸리고 100MB 크기의 출력 파일을 만들었습니다. 이제 그들은 데이터베이스에있어서 매우 쉽게 이동하거나 백업 할 수있는 단일 파일이 있습니다.
Richard

1
@Seun Osewa : 모든 파일 시스템에는 한계가 있습니다 ... 같은 디렉토리에 수백만 개의 항목을 저장하는 데 문제가없는 것을 알고 있다면 알려주십시오!
기 illa

1
@Seun Osewa : 데이터베이스는 5.4M 레코드로 현재 최대 28GB입니다. 약 5GB 크기의 백업 할 파일이 여러 개 있으므로 데이터베이스 테이블을 분할해야했지만 이제 개별 이미지를 Amazon S3로 옮기면 파일 이름 만 DB에 저장하면됩니다 (그리고 Amazon은 백업을 수행 할 수 있음) )
Richard

22

아무도 언급하지 않은 것은 DB가 원자 적 행동, 트랜잭션 무결성을 보장하고 동시성을 처리한다는 것입니다. 참조 적으로도 무결성은 파일 시스템과는 다릅니다. 파일 이름이 여전히 올바른지 어떻게 알 수 있습니까?

파일 시스템에 이미지가 있고 새 버전을 작성하거나 파일을 삭제할 때 누군가 파일을 읽고있는 경우 어떻게됩니까?

Blob도 관리 (백업, 복제, 전송)가 더 쉬우므로 사용합니다. 그들은 우리를 위해 잘 작동합니다.


특정 이미지를 동시에 두 번 업데이트 할 가능성은 무엇입니까?
Arafangion 2009

1
문제가 발생하기 위해 동시 업데이트가 필요하지 않습니다. 읽기 및 쓰기 일 수 있습니다. 우리의 경우에는 이것이 거의 보장됩니다.
Draemon 2009

20

데이터베이스의 이미지에 대한 파일 경로 만 저장하는 문제는 데이터베이스의 무결성을 더 이상 강요 할 수 없다는 것입니다.

파일 경로가 가리키는 실제 이미지를 사용할 수 없게되면 데이터베이스에 무심코 무결성 오류가 발생합니다.

이미지가 실제로 검색되는 데이터이고, 파일 시스템과 독립적으로 액세스하는 경우 (파일 시스템에 독립적으로 액세스하는 경우) 하나의 통합 데이터베이스에서 이미지를 쉽게 관리 할 수 ​​있다는 점을 고려하면 (이미지가 갑자기 사라지지 않음), 이미지가 갑자기 "사라질 수 있습니다"), BLOB 등으로 직접 저장하려고합니다.


17

내가 일하던 회사에서 Oracle 8i (the 9i) 데이터베이스에 1 억 5,500 만 개의 이미지를 저장했습니다. 7.5TB 가치.


5
물론. 분명히 데이터베이스는 지금 훨씬 더 큽니다. 데이터베이스에 데이터가 있다는 것은 다른 사이트에서 데이터베이스를 복제하는 것이 훨씬 쉽다는 것을 의미합니다.
graham.reeds

실제로 파일 시스템을 데이터베이스에 마운트 할 수있는 Oracle 데모를 보았습니다. 이것이 당신이 한 일인지 아십니까? (죄송 합니다만, 오라클에 대해서는 우연한 일이므로 아마 쓰레기를 말하고있을 것입니다.)
Stu Thompson

나는 그렇게 생각하지 않는다-데이터베이스에 이미지를 데이터베이스에 저장하고 있었다. 데이터베이스가 적극적으로 조정되었습니다-필드가 추가 및 제거됨에 따라 이미지 크기가 변경되는 것에 대한 여러 가지 토론이 기억납니다. 모든 것이 경계가 정렬되었습니다.
graham.reeds

14

일반적으로 인프라 (데이터베이스)의 일부를 확장하기 위해 가장 비싸고 가장 어려운 작업을 수행하고 모든로드를 처리하는 것에 대해 난폭하게 반대합니다. 반면에 : 특히 여러 웹 서버가 있고 데이터 동기화를 유지해야하는 경우 백업 전략을 크게 단순화합니다.

다른 것들과 마찬가지로 예상 크기와 예산에 따라 다릅니다.


13

모든 이미지를 SQL2005 BLOB 필드에 저장하는 문서 이미징 시스템을 구현했습니다. 현재 수백 GB가 있으며 우수한 응답 시간과 성능 저하가 거의 또는 전혀 없습니다. 또한 규정 준수를 위해 새로 게시 된 문서를 광학 주크 박스 시스템에 보관하여 표준 NTFS 파일 시스템으로 공개하는 미들웨어 계층이 있습니다.

우리는 특히 다음과 관련하여 결과에 매우 만족했습니다.

  1. 간편한 복제 및 백업
  2. 문서 버전 관리 시스템을 쉽게 구현할 수있는 기능

11

이것이 웹 기반 애플리케이션 인 경우, Amazon S3 또는 Nirvanix 플랫폼과 같은 타사 스토리지 전송 네트워크에 이미지를 저장하면 이점이있을 수 있습니다.


11

가정 : 응용 프로그램은 웹 사용 가능 / 웹 기반

아무도 이것을 실제로 언급하지 않은 것에 놀랐습니다 ... 전문가 인 다른 사람들에게 위임하십시오-> 타사 이미지 / 파일 호스팅 공급자를 사용하십시오 .

유료 온라인 서비스에 파일을 저장하십시오.

이것에 대해 이야기하는 또 다른 StackOverflow 스레드가 여기에 있습니다 .

이 스레드 는 왜 타사 호스팅 제공 업체를 사용해야하는지 설명합니다.

그만한 가치가 있습니다. 그들은 그것을 효율적으로 저장합니다. 서버에서 클라이언트 요청 등에 업로드되는 대역폭이 없습니다.


10

SQL Server 2008을 사용하지 않고 특정 이미지 파일을 데이터베이스에 배치해야하는 확실한 이유가있는 경우 "두 가지"방식을 모두 사용하여 파일 시스템을 임시 캐시로 사용하고 데이터베이스를 마스터 리포지토리로 사용할 수 있습니다 .

예를 들어, 비즈니스 로직은 이미지 파일을 제공하기 전에 디스크에 이미지 파일이 있는지 확인하고 필요할 때 데이터베이스에서 검색 할 수 있습니다. 이를 통해 여러 웹 서버의 기능을 사용하고 동기화 문제를 줄일 수 있습니다.


+1 또한 원본 이미지를 저장하여 캐시 된 / 최적화 된 버전을 제공하면서 나중에 크기 / 압축을 변경할 수 있습니다
Deebster

7

"실제 세계"예제가 얼마인지 잘 모르겠지만 현재 카드 이미지를 포함하여 트레이딩 카드 게임에 대한 세부 정보를 저장하는 응용 프로그램이 있습니다. 데이터베이스의 레코드 수는 현재까지 2851 개 레코드이지만, 특정 카드가 여러 번 릴리스되고 대체 아트 워크가 있다는 사실을 고려할 때 아트 워크의 "1 차 사각형"을 스캔 한 다음 동적으로보다 효율적으로 크기를 조정했습니다. 요청시 카드에 대한 테두리 및 기타 효과를 생성합니다.

이 이미지 라이브러리의 원래 작성자는 요청에 따라 이미지를 렌더링하는 데이터 액세스 클래스를 작성했으며,보기 및 개별 카드에 매우 빠르게 수행합니다.

이것은 또한 새로운 카드가 출시 될 때 배포 / 업데이트를 용이하게합니다. 이미지의 전체 폴더를 압축하여 파이프로 전송하고 적절한 폴더 구조가 생성되도록하는 대신 데이터베이스를 업데이트하고 사용자가 다시 다운로드하도록합니다. 현재 최대 56MB 크기는 좋지 않지만 향후 릴리스의 증분 업데이트 기능을 개발 중입니다. 또한 전화 접속 사용자가 다운로드 지연없이 응용 프로그램을 가져올 수 있도록하는 "이미지 없음"버전의 응용 프로그램이 있습니다.

이 솔루션은 응용 프로그램 자체가 데스크톱에서 단일 인스턴스를 대상으로하기 때문에 지금까지 효과적이었습니다. 이 모든 데이터가 온라인 액세스를 위해 보관되는 웹 사이트가 있지만이 방법으로 동일한 솔루션을 사용하지는 않습니다. 파일에 대한 액세스는 이미지에 대한 요청 빈도 및 볼륨에 따라 더 잘 확장되므로 파일 액세스가 바람직하다는 데 동의합니다.

바라건대이 주제가 너무 많지는 않지만 주제를보고 비교적 성공적인 소규모 / 중규모 응용 프로그램에서 내 통찰력을 제공하고자했습니다.


복제를 처리 할 때 데이터베이스에 이미지를 저장하는 것이 훨씬 뛰어난 IMO입니다.
경고음 경고음


7

저장하려는 이미지 수와 크기에 따라 다릅니다. 과거에 데이터베이스를 사용하여 이미지를 저장했으며 내 경험이 상당히 좋았습니다.

IMO, 데이터베이스를 사용하여 이미지를 저장하는 전문가는

A. 이미지를 보관하기 위해 FS 구조가 필요하지 않습니다
. B. 더 많은 수의 항목을 저장해야 할 때 데이터베이스 인덱스가 FS 트리보다 성능이 뛰어납니다
. C. 스마트하게 튜닝 된 데이터베이스는 쿼리 결과를 캐싱하는 데 훌륭한 작업을 수행
합니다. D. 백업은 간단합니다. 복제가 설정되어 있고 컨텐츠가 사용자 근처의 서버에서 제공되는 경우에도 잘 작동합니다. 이러한 경우 명시적인 동기화가 필요하지 않습니다.

이미지가 작을 경우 (예 : <64k) db의 스토리지 엔진이 인라인 (레코드) BLOB를 지원하는 경우 간접적 인 참조가 필요하지 않으므로 성능이 더 향상됩니다 (참조의 지역성이 달성 됨).

적은 수의 거대한 크기의 이미지를 처리 ​​할 때는 이미지 저장이 좋지 않을 수 있습니다. 이미지를 db에 저장하는 데 따른 또 다른 문제는 생성, 수정 날짜와 같은 메타 데이터가 응용 프로그램에서 처리되어야한다는 것입니다.


7

최근에 PDF / Word 파일을 MySQL 테이블에 저장하는 PHP / MySQL 앱을 만들었습니다 (지금까지 파일 당 최대 40MB).

장점 :

  • 업로드 된 파일은 다른 모든 것과 함께 백업 서버에 복제되므로 별도의 백업 전략이 필요하지 않습니다 (안심하십시오).
  • 업로드 / 폴더가 없어도 모든 응용 프로그램의 위치를 ​​알 필요가 없기 때문에 웹 서버 설정이 약간 더 간단합니다.
  • 데이터 무결성을 향상시키기 위해 편집을 위해 트랜잭션을 사용하게됩니다. 고아가 있거나 누락 된 파일에 대해 걱정할 필요가 없습니다.

단점 :

  • 테이블 중 하나에 500MB의 파일 데이터가 있으므로 mysqldump는 이제 looooong 시간이 걸립니다.
  • 파일 시스템과 비교할 때 전반적으로 메모리 / CPU 효율성이 떨어짐

구현을 성공이라고 부르고 백업 요구 사항을 처리하고 프로젝트 레이아웃을 단순화합니다. 앱을 사용하는 20-30 명의 사용자에게는 성능이 좋습니다.


6

내 경험상 나는 데이터베이스에 저장된 이미지와 db에 저장된 경로가있는 파일 시스템의 이미지를 모두 관리해야했습니다.

데이터베이스의 이미지 인 첫 번째 솔루션은 데이터 액세스 계층이 데이터베이스 개체 만 처리해야하기 때문에 다소 "깨끗합니다". 그러나 이것은 낮은 숫자를 처리해야 할 때만 좋습니다.

이진 대형 개체를 처리 할 때 데이터베이스 액세스 성능이 저하되고 데이터베이스 크기가 커져서 성능 손실이 다시 발생합니다. 일반적으로 데이터베이스 공간은 파일 시스템 공간보다 훨씬 비쌉니다.

반면에 파일 시스템에 큰 이진 객체를 저장하면 데이터베이스와 파일 시스템을 모두 고려해야하는 백업 계획이 생길 수 있으며 이는 일부 시스템에서 문제가 될 수 있습니다.

파일 시스템을 사용해야하는 또 다른 이유는 이미지 데이터 (또는 사운드, 비디오 등)를 타사 액세스와 공유해야 할 때입니다. 요즘에는 "외부에서 액세스해야하는 이미지를 사용하는 웹 앱을 개발하고 있습니다. "이진 데이터를 검색하기위한 데이터베이스 액세스가 불가능한 방식의 웹 팜입니다. 따라서 때로는 선택을 유도하는 디자인 고려 사항도 있습니다.

또한 이진 객체에 액세스 할 때 권한 및 인증을 처리해야하는 경우이 선택을 고려하십시오. 일반적으로 이러한 요구 사항은 데이터가 db에 저장 될 때 더 쉬운 방법으로 해결할 수 있습니다.


4

한 번 이미지 처리 응용 프로그램에서 일했습니다. 업로드 된 이미지를 / images / [오늘 날짜] / [ID 번호]와 같은 디렉토리에 저장했습니다. 그러나 이미지에서 메타 데이터 (exif 데이터)를 추출하여 타임 스탬프 등과 함께 데이터베이스에 저장했습니다.


4

이전 프로젝트에서 파일 시스템에 이미지를 저장했으며 백업, 복제 및 파일 시스템이 데이터베이스와 동기화되지 않아 많은 골칫거리가 발생했습니다.

내 최신 프로젝트에서 데이터베이스에 이미지를 저장하고 파일 시스템에 이미지를 캐싱하고 실제로 잘 작동합니다. 지금까지 아무런 문제가 없었습니다.


3

둘째, 파일 경로에 대한 권장 사항입니다. 대규모 자산 수집을 관리하는 데 필요한 몇 가지 프로젝트를 수행했으며 DB에 직접 저장하려고 시도하면 장기적으로 고통과 좌절이 발생했습니다.

DB에 저장하는 것과 관련하여 내가 생각할 수있는 유일한 "프로"는 개별 이미지 자산을 쉽게 만들 수있는 가능성입니다. 사용할 파일 경로가없고 모든 이미지가 DB에서 바로 스트리밍되는 경우 사용자가 액세스 할 수없는 파일을 찾을 위험이 없습니다.

그래도 웹 액세스 할 수없는 파일 저장소에서 데이터를 가져 오는 중개 스크립트를 사용하면 더 잘 해결되는 것처럼 보입니다. 따라서 DB 스토리지가 꼭 필요한 것은 아닙니다.


3

길거리의 말은 당신이 당신의 데이터베이스가 그것을 할 수 있다는 것을 증명하려고 노력하는 데이터베이스 벤더가 아니라면 (예를 들어, Microsoft가 SQL Server에 bajillion 이미지를 저장하는 Terraserver에 대해 자랑한다고 가정 해 보자) 그것은 좋은 생각이 아니라는 것입니다. 대안-데이터베이스의 파일 서버 및 경로에 이미지를 저장하는 것이 훨씬 쉬운 경우 왜 귀찮습니까? Blob 필드는 SUV의 오프로드 기능과 비슷합니다. 대부분의 사람들은 SUV를 사용하지 않으며, 보통 문제가있는 사람들은 사용하지만 재미는 있습니다.


3

데이터베이스에 이미지를 저장한다는 것은 이미지 데이터가 파일 시스템 어딘가에 있지만 가려져서 직접 액세스 할 수 없도록하는 것을 의미합니다.

+ ves :

  • 데이터베이스 무결성
  • 이미지를 추가하거나 삭제할 때 파일 시스템을 동기화하는 것에 대해 걱정할 필요가 없으므로 관리가 용이

-ves :

  • 성능 저하-데이터베이스 조회는 일반적으로 파일 시스템 조회보다 느립니다.
  • 이미지를 직접 편집 할 수 없습니다 (자르기, 크기 조정)

두 방법 모두 일반적이며 실용적입니다. 장단점을 살펴보십시오. 어느 쪽이든, 당신은 단점을 극복하는 방법에 대해 생각해야합니다. 데이터베이스에 저장하는 것은 일반적으로 데이터베이스 매개 변수를 조정하고 일종의 캐싱을 구현하는 것을 의미합니다. 파일 시스템을 사용하려면 파일 시스템 + 데이터베이스를 동기화 상태로 유지하는 방법을 찾아야합니다.

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