미디어 파일을 데이터베이스에 저장하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/154707

문제

많은 수의 사운드 파일을 데이터베이스에 저장하고 싶지만 좋은 연습인지 모르겠습니다. 나는 이런 식으로 그것을하는 장단점을 알고 싶습니다.

또한 해당 파일에 "링크"를 가질 가능성이 있다고 생각했지만 솔루션보다 더 많은 문제가 발생할 수 있습니다. 이 방향으로의 모든 경험은 환영받을 것입니다 :)

참고 : 데이터베이스는 MySQL입니다.

도움이 되었습니까?

해결책

내가 아는 모든 시스템은 많은 수의 큰 파일을 저장하면 데이터베이스 외부에 저장합니다. 파일의 부분 경로와 함께 파일 (제목, 아티스트, 길이 등)에 대한 쿼리 가능한 모든 데이터를 데이터베이스에 저장합니다. 파일을 검색 할 시간이되면 파일의 경로를 추출하고 파일 루트 (또는 URL)를 전제로 전환 한 후 반환합니다.

따라서 "A/B/C/1000"과 같은 부분 경로가있는 "위치"열이 있습니다.http : //myserver/files/a/b/c/1000.mp3"

데이터 복구가 필요한 경우 미디어 데이터베이스를 다른 서버/디렉토리에서 쉽게 가리킬 수있는 방법이 있는지 확인하십시오. 또한 파일 아카이브의 내용으로 데이터베이스를 다시 동기화하는 루틴이 필요할 수 있습니다.

또한 수천 개의 미디어 파일을 가지고 있다면 하나의 거대한 디렉토리에 모두 저장하지 마십시오. 일부 파일 시스템의 성능 병목 현상입니다. 대신, 여러 균형 잡힌 서브 트리로 분해하십시오.

다른 팁

좋은 구현을 사용하는 한 데이터베이스에 저장하는 것은 괜찮다고 생각합니다. 데이터베이스의 더 많은 양의 데이터가 성능에 영향을 미치지 않도록하는 방법에 대한 아이디어에 대한이 오래되었지만 좋은 기사를 읽을 수 있습니다.

http://www.dreamwerx.net/phpforum/?id=1

나는 말 그대로 100 대의 공연이 MySQL 데이터베이스에 아무런 문제없이로드되었습니다. 디자인과 구현이 핵심이며 잘못되면 어려움을 겪을 것입니다.

더 많은 DB 장점 (아직 언급되지 않음) : -로드 밸런스 환경에서 더 잘 작동합니다 - 더 많은 백엔드 스토리지 확장 성을 구축 할 수 있습니다.

나는 다른 프로젝트에서 두 가지 방법으로 실험했으며 마침내 파일 시스템을 사용하는 것이 더 쉽다고 결정했습니다. 결국 파일 시스템은 이미 파일 저장, 검색 및 인덱싱에 최적화되어 있습니다.

내가 가지고있는 한 가지 팁은 데이터베이스에 파일에 "루트 상대"경로 만 저장 한 다음 프로그램 또는 쿼리/저장 프로 시저/중간웨어 설치 특정 루트 매개 변수를 사용하여 파일을 검색하는 것입니다. .

예를 들어, xyz.wav를 c : myProgram data sounds x 에 저장하면 전체 경로는 다음과 같습니다.

C:\MyProgram\Data\Sounds\X\XYZ.Wav

그러나 데이터베이스에 경로 및 또는 파일 이름을 저장합니다.

X\XYZ.Wav

다른 곳, 데이터베이스 또는 프로그램의 구성 파일에서 SoundFilePath와 같은 루트 경로를

C : myProgram data sounds

물론 데이터베이스 경로에서 루트를 분할하는 곳은 귀하에게 달려 있습니다. 이렇게하면 프로그램 설치를 이동하면 데이터베이스를 업데이트 할 필요가 없습니다.

또한있을 경우 많이 파일의 파일, 경로를 해싱하는 방법을 찾으십시오. 수백 또는 수천 개의 파일이 포함 된 하나의 디렉토리를 사용하지 않도록하십시오 (내 작은 예에서는 파일 이름의 첫 번째 문자를 기반으로 하위 디렉토리가 있지만 더 깊이 나거나 더 깊이 갈 수 있습니다. 임의의 해시를 사용하십시오). 이것은 검색 인덱서도 행복하게 만듭니다.

데이터베이스 사용의 장점 :

  • 다른 데이터 비트와 함께 사운드 파일에 쉽게 가입 할 수 있습니다.
  • 데이터베이스 보안을 우회하는 파일 I/O 작업을 피합니다.
  • 데이터베이스 레코드가 삭제 될 때 사운드 파일을 삭제하기 위해 분리 작업이 필요하지 않습니다.

데이터베이스 사용의 단점 :

  • 데이터베이스 팽창
  • 데이터베이스는 파일 시스템보다 더 비쌀 수 있습니다

Blob (또는 Longblobs)로 저장 한 다음 실제로 미디어 파일에 액세스 할 때 데이터를 검색 할 수 있습니다.

또는

미디어 파일을 드라이브에 저장하고 메타 데이터를 DB에 저장할 수 있습니다.

나는 후자의 방법에 기대어있다. 나는 이것이 전 세계적으로 어떻게 이루어 지는지는 모르겠지만, 다른 많은 사람들이 똑같이 할 것이라고 생각합니다.

링크 (데이터의 부분 경로)를 저장 한 다음이 정보를 검색 할 수 있습니다. 드라이브에서 물건을 쉽게 움직일 수 있고 여전히 액세스 할 수 있습니다.

파일에 대한 다른 메타 데이터와 함께 DB의 각 파일의 상대 경로를 저장합니다. 그런 다음 실제 데이터를 다른 드라이브 (로컬 또는 UNC 경로)로 이전 해야하는 경우 기본 경로를 즉시 변경할 수 있습니다.

그게 내가하는 방법입니다. 나는 다른 사람들도 아이디어를 가질 것이라고 확신합니다.

파일을 저장하기 위해 블로브를 사용하는 몇 가지 장점

  • 낮은 관리 오버 헤드 - 단일 도구를 사용하여 백업 / 복원 등
  • 데이터베이스 및 파일 시스템이 동기화되지 않을 가능성이 없습니다.
  • 거래 기능 (필요한 경우)

일부 단점

  • 쓸모없는 쓰레기로 데이터베이스 서버의 RAM을 날려 줄, 인덱스 등을 저장하는 데 사용할 수 있습니다.
  • DB 백업을 매우 크게 만들어서 관리하기 쉽지 않습니다.
  • 클라이언트에 서비스를 제공하는 파일 시스템만큼 편리하지 않습니다 (예 : 웹 서버를 사용하면)

성능은 어떻습니까? 귀하의 마일리지가 다를 수 있습니다. 파일 시스템은 매우 다양하므로 성능의 데이터베이스입니다. 경우에 따라 파일 시스템이 승리합니다 (아마도 더 큰 파일이 적음). 경우에 따라 DB가 더 나을 수 있습니다 (아마도 매우 많은 작은 파일이있는 경우).

어쨌든 걱정하지 마십시오. 당시 가장 잘 보이는 일을하십시오.

일부 데이터베이스는 블로브를 제공하는 내장 웹 서버를 제공합니다. 글을 쓰는 시점에서 MySQL은 그렇지 않습니다.

외부 파일로 저장하십시오. 그런 다음 바르 차르 필드에 경로를 저장하십시오. 대형 바이너리 블로브를 관계형 데이터베이스에 넣는 것은 일반적으로 매우 비효율적입니다. 캐시가 채워지면서 공간을 사용하고 느리게 할 수 없습니다. 그리고 아무것도 얻을 것이 없습니다 - blobs 자체는 찾을 수 없습니다. 미디어 메타 데이터를 데이터베이스에 저장할 수 있습니다.

간단한 솔루션은 파일의 상대 위치를 문자열로 저장하고 파일 시스템이 처리하도록하는 것입니다. 프로젝트에서 시도해 보았습니다 (우리는 사무실 파일 첨부 파일을 설문 조사에 저장하고있었습니다).

오디오/비디오 파일을 저장하는 가장 좋은 방법은 로컬 또는 클라우드에있을 수있는 분산 스토리지를 사용할 수 있습니다.

https://min.io/

클라우드의 경우 : AWS S3

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top