문제

직장에서 최근 CouchDB (문서 지향 데이터베이스)를 사용하여 프로젝트를 시작했습니다. 나는 모든 관계형 DB 지식을 배우지 못하는 데 어려움을 겪고 있습니다.

여러분 중 일부 가이 장애물을 극복했는지 궁금합니다. 어떻게 관계 적으로 생각을 멈추고 문서적으로 생각을 시작 했습니까 (그 단어를 구성하는 것에 대해 사과드립니다).

제안이 있습니까? 도움되는 힌트?

편집하다: 차이가있는 경우 Ruby & Couchpotato를 사용하여 데이터베이스에 연결합니다.

편집 2: 대답을 받아들이도록 나를 괴롭 히고있었습니다. 나는 내가 가장 많이 배우는 데 도움이 된 것을 선택했다고 생각합니다. 그러나 실제 "올바른"대답은 없다고 생각합니다.

도움이 되었습니까?

해결책

이 주제에 대한 몇 페이지에 대해 숙독 한 후에는 모두 다루는 데이터 유형에 달려 있다고 생각합니다.

RDBMSE는 데이터베이스 디자이너가 데이터베이스에 존재할 모든 데이터의 구조를 주장하는 하향식 접근법을 나타냅니다. 당신은 사람이 첫 번째, 마지막 중간 이름과 홈 주소 등을 가지고 있음을 정의합니다. RDBMS를 사용하여이를 시행 할 수 있습니다. 당신이 사람의 홈 플래 넷을위한 칼럼이 없다면, 힘든 행운은 지구와 다른 홈 플랜트를 가진 사람을 원한다. 나중에 열을 추가하거나 데이터를 RDBMS에 저장할 수 없습니다. 대부분의 프로그래머는 어쨌든 앱에서 이와 같은 가정을합니다. 따라서 이것은 가정하고 시행하는 바보 같은 일이 아닙니다. 물건을 정의하는 것이 좋을 수 있습니다. 그러나 향후 추가 속성을 기록 해야하는 경우 추가 속성을 추가해야합니다. 관계 모델은 데이터 속성이 크게 변경되지 않는다고 가정합니다.

MapReduce와 같은 것을 사용하는 "클라우드"유형 데이터베이스는 COUCHDB와 같은 경우 위의 가정을하지 않고 대신 상향식에서 데이터를 보지 않습니다. 데이터는 문서에 입력되며, 다양한 속성을 가질 수 있습니다. 그것은 당신의 데이터가 그 정의에 의해 그것이 가질 수있는 속성 유형에 다양하다고 가정합니다. "나는 단지"Eternium "의 HomePlanet 속성과"Lord Nibbler "의 첫 이름이지만 마지막 이름이없는 데이터베이스 사람 에이 문서가 있다는 것을 알고 있습니다. 이 모델은 웹 페이지에 적합합니다. 모든 웹 페이지는 문서이지만, 문서의 실제 내용/태그/키는 DBMS가 높은 곳에서 곤경에 처한 견고한 구조에 맞출 수 없다는 SOO가 크게 다릅니다. 그렇기 때문에 Google의 데이터 세트가 Get-Go에서 모호하게 구축 해야하는 Google의 데이터 세트가 매우 다양하기 때문에 Google이 MapReduce 모델 Roxors Soxors를 생각하는 이유입니다. 대규모 데이터 세트로 인해 병렬 처리를 활용할 수 있습니다 (Mapreduce는 사소한). . Document-Database 모델은 데이터의 속성이 "갭"및 데이터가 관계형 데이터베이스에 저장되었는지 여부를 찾을 수있는 많은 드문 인구가 많은 열을 많이 변경하거나 매우 다양 할 수 있다고 가정합니다. RDBM을 사용하여 이와 같은 데이터를 저장할 수 있지만 실제로는 추악 해집니다.

당신의 질문에 답하기 위해 : 당신은 MapReduce 패러다임을 사용하는 데이터베이스를 볼 때 "관계 적으로"생각할 수 없습니다. 실제로는 강제 관계가 없기 때문입니다. 그것은 당신이 극복해야 할 개념적인 혹입니다.


내가 비교하고 두 데이터베이스를 잘 대조하는 좋은 기사는 Mapreduce : 주요 단계 뒤로, MapReduce 패러다임 데이터베이스는 뒤로 기술적 인 단계이며 RDBMSS보다 열등하다고 주장합니다. 저자의 논문에 동의하지 않아야하며 데이터베이스 디자이너가 자신의 상황에 맞는 올바른 것을 선택해야한다고 제출할 것입니다.

다른 팁

데이터에 관한 것입니다. 관계 적으로 가장 의미가있는 데이터가있는 경우 문서 저장소가 유용하지 않을 수 있습니다. 일반적인 문서 기반 시스템은 검색 서버이며 거대한 데이터 세트가 있으며 특정 항목/문서를 찾으려면 문서가 정적이거나 버전화되어 있습니다.

아카이브 유형 상황에서 문서는 문자 그대로 문서 일 수 있으며, 변경되지 않고 매우 유연한 구조를 가질 수 있습니다. 메타 데이터를 관계형 데이터베이스에 저장하는 것은 합리적이지 않습니다. 왜냐하면 그것들은 모두 매우 다르기 때문에 해당 태그를 공유 할 수있는 문서는 거의 없기 때문입니다. 문서 기반 시스템은 널 값을 저장하지 않습니다.

비 관계형/문서와 같은 데이터는 비정규 화 될 때 의미가 있습니다. 크게 변하지 않거나 일관성에 대해 크게 신경 쓰지 않습니다.

유스 케이스가 관계형 모델에 잘 맞는 경우 문서 모델로 압박 할 가치가 없을 것입니다.

다음은 좋은 기사입니다 비 관계형 데이터베이스.

그것에 대해 생각하는 또 다른 방법은 문서가 행입니다. 문서에 관한 모든 것은 그 행에 있으며 해당 문서에만 해당됩니다. 행을 분할하기 쉽기 때문에 스케일링이 더 쉽습니다.

Lotus Notes와 마찬가지로 CouchDB에서는 문서가 행과 유사하다고 생각해서는 안됩니다.

대신, 문서는 a입니다 관계 (테이블).

각 문서에는 여러 행, 필드 값이 있습니다.

ValueID(PK)  Document ID(FK)   Field Name        Field Value
========================================================
92834756293  MyDocument        First Name        Richard
92834756294  MyDocument        States Lived In   TX
92834756295  MyDocument        States Lived In   KY

각보기는 모든 문서의 대규모 노조 전체에서 선택하는 크로스 타브 쿼리입니다.

따라서 여전히 관계 적이지만 가장 직관적 인 의미는 아니며 가장 중요한 의미는 아닙니다 : 좋은 데이터 관리 관행.

문서 지향 데이터베이스는 관계 개념을 거부하지 않으며 때로는 응용 프로그램이 링크 (CouchDB)를 해석하거나 문서 간 관계를 직접 지원할 수있게합니다 (MongoDB). 더 중요한 것은 DODB가 스키마가 없다는 것입니다. 테이블 기반 Storages 에서이 속성은 상당한 오버 헤드로 달성 할 수 있지만 (RichardTallent의 답변 참조), 여기서는 더 효율적으로 수행됩니다. RDBMS에서 DODB로 전환 할 때 실제로 배워야 할 것은 테이블을 잊고 데이터에 대한 생각을 시작하는 것입니다. 그것이 양분기가 "상향식"접근법이라고 부르는 것입니다. 사전 정의 된 Procrustean 침대가 아니라 끊임없이 진화하는 스키마입니다. 물론 이것은 스키마가 어떤 형태로든 완전히 버려야한다는 것을 의미하지는 않습니다. 응용 프로그램은 데이터를 해석하고 어떻게 든 양식을 제한해야합니다. 이는 검증 방법이있는 모델을 만들어 문서를 컬렉션으로 구성하여 수행 할 수 있지만 이제는 응용 프로그램의 작업입니다.

이것을 읽어야 할 수도 있습니다http://books.couchdb.org/relax/getting-started

나는 방금 들었고 흥미롭지 만 현실 세계 응용 프로그램에서 그것을 구현하는 방법을 모른다;)

당신이 시도 할 수있는 한 가지는 Firefox와 Firebug의 사본을 얻고 지도 그리고 줄이다 JavaScript의 기능. 그들은 실제로 매우 시원하고 재미 있으며 CouchDB에서 일을하는 방법의 기초 인 것 같습니다.

주제에 대한 Joel의 작은 기사는 다음과 같습니다. http://www.joelonsoftware.com/items/2006/08/01.html

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