2009-07-08 2 views
4

데이터베이스에 저장된 데이터가 매우 일반적인 콘텐츠 관리 응용 프로그램을 작성 중입니다. 이 특별한 경우 컨테이너에는 많은 자원이 있으며 이러한 자원은 사진, 영화, 업로드 된 파일 또는 일반 텍스트와 같은 일종의 디지털 자산에 매핑됩니다.데이터베이스 대신 파일 시스템에서 내 텍스트를 제공 하시겠습니까?

필자는 그림을 저장하는 것 외에도 파일 시스템에 텍스트 에셋을 저장하고 응용 프로그램에서 데이터베이스 (파일 위치)를 검색하도록하고 있기 때문에 일주일 동안 동료와 의견을 나눴습니다.), 클라이언트 응용 프로그램에 제공하기 전에 텍스트 파일 (파일 시스템에서)을 읽으십시오.

상식적으로 나는 우스꽝 스러웠다. 데이터베이스에서 뭔가를 찾으려고해도 텍스트를 데이터베이스 열에 저장하고 행 검색과 함께 제공 할 수도있다. 데이터베이스 조회 + 파일 IO는 제어 할 수 없을 정도로 느린 것처럼 보였습니다. 얼마 동안 앞뒤로 가고 난 후에, 나는 약간의 벤치 마크를 달리기로 결정했고, 결과는 조금 놀랍다 고 알았다. 벤치 마크 시간에는 일관성이 거의없는 것처럼 보입니다. 벤치 마크에서 유일한 확실한 승자는 데이터베이스에서 대량의 데이터 세트를 가져 와서 텍스트 자산을 표시하기 위해 결과를 반복하는 것이었지만 데이터베이스에서 개체를 한 번에 하나씩 가져 와서 텍스트 콘텐츠를 표시하는 것이 목과 목인 것처럼 보였습니다.

이제는 벤치 마크 실행의 한계를 알고 있으며 "테스트"에 대한 올바른 생각조차 모르고 있습니다 (예 : 파일 시스템 쓰기가 데이터베이스 쓰기보다 훨씬 빠릅니다). . 제 질문은 확인을위한 것 같아요. 파일 I/O는 데이터베이스 텍스트 저장/조회와 비교할 수 있습니까? 여기서 논쟁의 일부를 놓치고 있습니까? 미리 의견/조언을 주셔서 감사합니다!

내가 사용하고있는 일에 대해 빠른 작업 : 이 루비 1.8.6 및 sqlite3를을 사용하여 루비 레일에 응용 프로그램, 입니다. 내일 같은 코드베이스를 MySQL 으로 옮길 계획이며 벤치 마크가 인지 확인하십시오.

+0

나는 천국을 사용할 수 없었다 그러한 테스트를 직접 해보지는 않았지만, 파일 시스템이 많은 파일과 어떻게 섞여 있는지 궁금합니다. 궁극적으로 파일 시스템은 일종의 데이터베이스이기도합니다. "실제"데이터베이스에 대해 내가 좋아하는 것은 거래 처리/원자 삽입입니다. 필자는 파일 시스템을 사용하여 파일이 손상된 상태로 남겨지는 작업의 중간에 쓰기가 중단 될 수 있다는 두려움과 편집증에 빠져 있습니다. 파일 시스템에 큰 "멍청한"파일 (이미지와 같은)을 넣고 파일 이름을 db에 저장하는 것이 일반적인 방법이라고 생각합니다. 웹 서버가 직접 서비스를 제공하도록하십시오. –

답변

1

여러분의 벤치 마크 결과는 데이터베이스에 텍스트 데이터를 저장하는 방법에 달려 있다고 생각합니다. LOB로 저장 한 다음이면에서 일반 파일로 저장합니다. LOB의 종류에 관계없이 데이터베이스 조회 + 파일 IO를 지불해야합니다.

VARCHAR는

일반 텍스트 데이터 유형 (VARCHAR 등)이 매우 일반적인 관계형 데이터베이스 시스템의 크기가 제한되는 테이블에 저장된다. 2000 또는 4000 (Oracle) 또는 8000 또는 심지어 65536 문자와 같은 것입니다. 일부 데이터베이스는 긴 텍스트 을 지원하지만 these have serious drawbacks and are not recommended을 지원합니다.

의 LOB는 참조 텍스트 당신이 LOB 데이터 유형 (오라클에서 예를 들어, CLOB)를 사용하는이 큰 경우 시스템이

오브젝트 파일에 있습니다.

LOB는 일반적으로 다음과 같이 작동합니다. 데이터베이스는 파일 시스템 개체에 대한 참조 만 저장합니다. 파일 시스템 객체는 데이터 (예 : 텍스트 데이터)를 포함합니다. DBMS가 참조 및 파일 관리 의 많은 작업을 수행한다는 것을 제외하고는 동료가 제안한 것과 매우 유사합니다.

결론은 다음과 같습니다. 텍스트를 VARCHAR에 저장할 수 있으면 이동하십시오. 두 가지 옵션을 사용할 수없는 경우 : LOB를 사용하거나 데이터베이스에서 참조하는 파일에 데이터를 저장하십시오. 둘 다 기술적으로 유사하며 VARCHAR을 사용하는 것보다 느립니다.

+0

우리가 사용하게 될 데이터베이스는 mysql5로, 내가 쏟아져 나오는 문서이다. 이 페이지 : http://dev.mysql.com/doc/refman/5.1/en/char.html 이론적으로 최대 문자 길이가 65,535로 설정 될 수 있음을 나타내는 것 같습니다 ... 위험한 것으로 지정한 길이를 훨씬 초과하는 소리가납니다. ... 비록 그 65,535 바이트 및 유니 코드, 내가 볼 필요가 오면 전환이 무엇인지 모르겠습니다. LOB이 아닌 긴 문자열 (MySQL의 텍스트 필드)이 위험 할 수 있다고 생각하십니까? – BushyMark

+0

유니 코드가 어떻게 처리되는지 궁금했습니다. utf-8로 저장되면 한 문자는 최대 4 바이트이며 영어 텍스트의 경우 문자 당 1 바이트가 일반적입니다. MySQL에서 실제로 큰 VARCHARS로 볼 수있는 한 가지 위험은 최대 행 크기 (65,535 바이트, 모든 열에서 공유 됨)를 채울 수 있다는 것입니다. MySQL에서 TEXT와 VARCHAR의 성능 비교는 http://forums.mysql.com/read.php?24,105964,105964 –

3

파일 시스템을 사용하지 않을 때 얻을 수있는 가장 큰 이점은 데이터베이스가 동시 액세스를 올바르게 관리한다는 것입니다. 2 개의 프로세스가 같은 텍스트를 동시에 수정해야한다고 가정하면 파일 시스템과의 동기화로 인해 경쟁 조건이 발생할 수 있지만 데이터베이스의 모든 문제에는 전혀 문제가 없습니다.

+0

을 참조하십시오. – BushyMark

0

나는 이것을 전에했다. 그 혼란, 파일 시스템과 데이터베이스를 항상 동기화시켜야하므로 추측 하듯이 프로그래밍이 더욱 복잡해집니다. 필자의 조언은 데이터에 따라 모든 파일 시스템 솔루션 또는 모든 데이터베이스 솔루션을 선택하는 것입니다. 주목할 만하게는, 많은 수의 검색, 조건부 데이터 검색이 필요하다면 데이터베이스로 이동하십시오. 그렇지 않으면 fs입니다. 큰 바이너리 파일을 저장하기 위해 데이터베이스가 최적화되지 않을 수 있습니다. 아직도 기억하십시오. 둘 다 사용한다면, 동기화 된 상태로 유지해야 할 것이며, 우아하고 즐겁게 (프로그램하기 위해) 해결책을 찾지 못할 것입니다. 행운을 빈다!

0

문제는 "성능 측면"에서 오는 경우 적어도, 당신은 "에는 SQL"(예를 들어 옴을 통해) 레디 스, 또는 CouchDB를 같은 스토리지 솔루션 ...

관련 문제