Schema-less database MongoDB Programming

MongoDB는 따로 스키마가 존재하지 않고 그냥 JSON 형태로 레코드를 저장합니다. 이런 형태를 schema-less 혹은 Document-oriented database라고 하더군요. 이런 형태의 DB중에는 CouchDB가 가장 유명한 것 같더군요.

CouchDB 소개글 - http://xeraph.com/4617633

참고로 CouchDB는 Erlang, MongoDB는 C++로 작성되어 있습니다.

MongoDB 에서 레코드가 저장되는 방식은 아래와 같습니다.
FirstName="Bob", Address="5 Oak St.", Hobby="sailing"
FirstName="Jonathan", Address="15 Wanamassa Point Road", Children=["Michael,10", "Jennifer,8", "Samantha,5", "Elena,2"]
실제 저장되는 방식은 stl map처럼 {키:값} 형식으로 인것 같습니다.

스키마가 없이 저장이 되니 당연히 느릴거라고 생각했습니다만 MySQL과 benchmark 결과가 있습니다.
INSERT
http://www.idiotsabound.com/howd-that-mongo-get-so-fast

SELECT
http://www.idiotsabound.com/did-i-mention-mongodb-is-fast-way-to-go-mongo

기타
http://blog.jasonmooberry.com/2009/08/mongodb-and-symfony-yes-part-1-inserts/
http://blog.jasonmooberry.com/2009/08/mongodb-and-symfony-yes-part-2-simple-queries/
http://obvioushints.blogspot.com/2009/07/benchmarking-mongodb-vs-mysql.html

CouchDB와의 bench
http://bcbio.wordpress.com/2009/05/10/evaluating-key-value-and-document-stores-for-short-read-data/

MySQL에 비해 느리지 않다고 합니다.

실제 활용쿼리

INSERT

db.testdb.insert( {Serial:1, Name:"alice"} )
db.testdb.insert( {QuestId:5, QuestNpc:"guard", RequiredLevel:12} )

SELECT
db.testdb.find( {Name:"alice"} )
db.testdb.find( "this.RequiredLevel > 10" )

UPDATE

db.testdb.update( {Serial:1, Name:"alice"}, {Serial:1, Name:"rabbit"} )

DELETE
db.testdb.remove( {Serial:1, Name:"rabbit"} )

다른 DB로 복사
db.testdb.find().forEach( function(x){ db.targetdb.save(x) } )

특정 필드가 있는 레코드만
db.testdb.find( {QuestNPC:{$exists:true}} )

정규식으로 검색
db.testdb.find( {QuestNPC:/guar./} )

위의 예는 shell에서 사용하는 방식이고 다른 언어도 비슷할거라 생각합니다. 현재는 C++, Java, python, Ruby, Perl, PHP 지원하더군요.

사용하고 있는 곳
http://www.mongodb.org/display/DOCS/Production+Deployments
소스포지 , EA, github, 뉴욕타임즈 등에서 이미 MongoDB를 제한적인 분야에서 사용하고 있습니다.

게임쪽에서도 이런 형태의 DB가 필요한 곳은 많으리라 봅니다. 퀘스트 저장이나 UCC 형식의 데이터 저장에 유용하겠죠. 또한서비스 중에 스키마가 틀려서 발생하는 문제, 개발 초반에 변경이 많을때 발생하는 문제도 해결이 가능할겁니다.

MongoDB 는 오픈소스로 개발되고있고 앞으로의 로드맵도 모두 공개되어 있습니다. 사용은 무료이고 기술지원에만 비용을 청구하는 방식입니다.웹 싸이트에 문서화가 잘 되어 있습니다. 전체가 Confluence(wiki의 일종)로 되어 있더군요. 언제든지 PDF로변환해서 받을수도 있습니다. 무척 깔끔해서 마음에 들더군요. :)


덧글

댓글 입력 영역