Skip to main content

NoSQL

NoSQL과 NewSQL

NoSQL: 분산 아키텍처의 확장성, 스키마 없는 데이터 관리가 특징이며, 기존 SQL과 다르다.

NewSQL: 분산 아키텍처의 확장성하거나, ....


종래의 관계형DB에서 관계 속성이 지니는 구속적인 개념에서 벗어남.
예를 들어, 스키마 제약으로 인한 필드 값의 제한적이 사용이 예로 들 수 있다.

일관성보다는 가용성과 확장성에 중점을 둔 정장 방식을 취함.
오픈 소스 중에서 얼랭(Erlang)으로 제작된 CouchDB와 MongoDB가 있다.


얼랭은, 상업적 함수 기반 언어로, 속도가 빠르고, 언어 자체적으로 분산을 지원한다.
따라서 별도의 쓰래드 모델을 사용하지 않는다.




MongoDB의 특징은 다음과 같습니다.
0. 문서기반이다.
1. 빠르고 사용하기 쉽다.
2. RDBMS의 범위쿼리, 보조색인, 정렬 같은 관계형 연산 기능과 MapReduce같은 집계연산 기능을 동시에 지원한다.
3. 다양한 언어를 지원한다.(C, java, 파이썬... 등 약 10여개의 언어에 맞는 드라이버 제공)
4. C++로 작성되었다.
5. 수평적 무한확장 가능하다.
6. 데이터는 bson형태로 저장된다.(binary json)
7. 구조적이지 않다.(RDBMS처럼 데어터를 분석해서 모델링을 상세하게 할 필요가 없음, 스키마가 없음)

구조적/개발자적 관점으로 보면 다음과 같습니다.
1. 객체 형태의 컬렉션 기반 저장소
2. 동적 쿼리 지원
3. 내부 객체를 지원하는 Full index 지원
4. 쿼리 프로파일링
5. 복제, fail-over 지원
6. 비디오파일 과 같은 바이너리 데이터의 효과적인 저장소
7. 클라우드 기반의 자동화된 공유

MongoDB도 여타의 NoSQL처럼 테이블, 로우, 컬럼등이 존재하지 않습니다.
저장의 최소단위는 Document 이며 이는 RDBMS의 로우와 비슷하다고 보면됩니다.
각 Document는 RDBMS의 테이블과 비슷한 컬렉션이라는 곳에 모여 있습니다.
그리고 각 컬렉션은 데이터베이스에서 관리하게 됩니다.
Document의 구조를 미리 정의하지 않아도 되기때문에 어떤 Document에는 id가 존재하지만 어떤 Documemt에는 name만 존재할 수 도 있습니다.
하지만 추후 분석 및 데이터 처리를 위해서 비슷한 성격의 Document를 같은 컬렉션에서 관리하는게 좋습니다.
예를 들어 회원  정보 조회에 필요한 name, id, pwd...등의 document와 게시판 형태의 subject, content, attachmemt 들을 같은 컬렉션에 저장하면 조회나 수정시 불편하고 비효율적이니까요.

json 형태의 데이터 예)
{ name : “Joe”, x : 3.3, y : [1,2,3] }
{ name : “Kate”, x : “abc” }
{ name : “Joe”, age : 30, interests : ‘football’ }
{ name : “Kate”, age : 25 }
MongoDB는 json에 바이너리 기능을 추가해서 bson이라는 형태로 데이터를  저장합니다.

동적으로 데이터의 스키마를 바꿀 수 있고 빠르고 확장이 편하기 때문에 고객의 요구가 시시때때로 변하는 web 기반의 서비스나 모바일 서비스와 아주 궁합이 잘 맞습니다.


Comments

Popular posts from this blog

맥OS 사전에 사전 파일 추가하기

1. http://code.google.com/p/mac-dictionary-kit/에서 sdconv를 다운로드 받는다. 2. e4u 등과 같은 사전 파일(stardict 형식)을 다운받는다. 3. 사전 파일의 압축을 풀면, e4u.ifo, e4u.dict.dz, e4u.idx와 같은 파일이 보인다. 4. sdconv 디렉터리 내의 convert 실행 파일로 convert e4u.ifo를 실행한다. 5. 위 과정이 완료되면 아래와 같이 사전에 e4u가 추가된 점을 확인할 수 있다. 6. 순서를 조절하여 사용하면 된다.

Sqlite database is locked

sqlite는 embedded system에서 널리 사용되는 무료 dbms?(dbms라고 말하긴 좀 그렇지만, dbms라 불러주자 ㅎ) 이다. 특히 memory db 기능이 아주 유용하다. 그 밖의 dbms에서도 이 기능이 있으나, 이 기능이 지원되는 버전은 대부분 고가이다. 따라서, 무료인 sqlite를 많이들 애용하는 것 같다. 멀티쓰레드를 sqlite DB를 구현하고 롱런테스트를 하다보면, pthread_mutex_lock으로 쓰레드 간의 교착상태를 막아줘도, sqlite lock 에러가 간헐적으로 발생할 것이다. 이에 대해 본인은 다음과 같은 에러 처리 구문을 준비하여 사용하고 있다. sqlite Error가 발생하면, sqlite3_exception함수를 호출한다. 이 함수에서 sqlite error code를 구분하여, 만약, busy 또는 locked이면 최대 2초간 sleep 상태로 만드는 sqlite3_busy_timeout, busy handler를 호출한다. 그 다음, goto 구문으로 재차 sqlite3_exec를 실행한다. 단, sqlite3_exec는 transaction의 begin과 commit 또는 rollback 구문 사이에서 실행한다. 대부분 lock 에러가 발생하더라도 1~2번 실패 후에, 처리된다는 것이 본인의 테스트 결과이다. 단, journal를 WAL로 변경하였음. 기존 journal은 멀티쓰레드 지향적이지 않다는 점을 잊지마시길.... Error Code SQLITE_LOCKED (6): Database Is Locked This error code occurs when you try to do two incompatible things with a database at the same time from the same database connection. For example, if you are in the middle of a SELECT statement and you t

SAStruts란

SAStruts 개요 Struts는 Spring Framework 다음으로 많이 사용되고 있는 FrameWork이다. Struts는 프레임워크로 강력한 기능을 제공한다. 하지만, 개발 과정에서 부수적인 설정 작업이 개발자들을 힘들게 했다. 이 문제를 해결하기 위해, 일본 개발자 커뮤니티 Seasar(일본 오키나와의 전설 동물, 우리나라의 해태와 비슷^^) 에서 개발한 프레임워크가 SAStruts(Super Agile Struts)이다. 아래 아키텍처 그림과 같이, SAStruts의 모태는 Struts이다. 다만, 상기한 복잡하고 까다로운 설정 작업을 그림2와 같이 SAStruts가 개발자 대신 내부적으로 처리해 준다. 예를 들어, Struts는 항상 struts-config.xml을 읽고 Action 클래스를 호출한다. 이 때문에, 개발자는 소스 코드를 수정한 후, 늘 struts-c onfig.xml 파일을 검토 또는 수정해야 한다. 또한, 대형 프로젝트일 경우는, 이 struts-config.xml 파일이 경합을 자주 일으킨다. 이는 실로 개발자의 스트레스 치수를 높이는 원인이다. 반면, SAStruts는 이 번거로운 작업을 알아서 처리해 준다. 아리가또~~~ 입니다. 그림1 Struts 아키텍처 그림2 SAStruts 아키텍처 그럼, 이 번거로운 작업을 SAStruts는 어떻게 처리하는 것인지 궁금할 것이다. 그것은 Java의 annotation기술을 이용한 점이다. 예를 들어, @Execute, @ActionForm, @Resource 등 Seasar 커뮤니티에서 제공하는 Dolteng 플러그인을 사용하면, SAStruts 개발이 더욱 효율적이다. SAStruts 프로젝트는 다음과 같은 패키지 구조로 형성된다. [root package].action Action 클래스 [root package].condition 데이터베이스에 엑세스하는 조건 설정 [root packa