MongoDB 를 다루면서 드는 생각 - MongoDB vs RDBMS(MySQL), cursor

태그
MongoDB
MySQL
DataBase
Cursor
공개여부
작성일자
2020/06/03
부제: MongoDB vs RDBMS(MySQL), cursor
mongodb-vs-mysql.png
MySQL 과 같은 RDB에 익숙했지만 좌표를 저장하고 다뤄야 한다는 spatial 프로젝트를 경험하고, 기술조사를 하면서 MongoDB 의 매력에 대해 알게 되었다.
schma-free 라는 특징이 가장 인상적이었는데 몇몇 프로젝트는 이미 데이터가 900만건 이상 저장되어있고, 실시간으로 운영되고 있음에도 불구하고, column 추가의 필요성이 있어 alter table 을 실행하곤 하였다.
다행히 alter table 이후 장애는 없었지만, 과연 live 인 RDB에 이러한 행동을 하는건 올바른가? 라는 질문을 수도없이 해왔다. 이 환경에 대응할 수 없는 회사의 상황, 환경 이건 어딜 가나 맞찬가지라고 생각했다. 데이터가 실시간으로 쌓이고 있는데 그걸 어떻게 백업하고, 누락된 데이터에 대한 전처리 후처리는 어떻게 할 것인가?
이런 고민을 한번에 해결할 수 있었던 것이 MongoDB 였다. column이 아닌 field 였고, table 이 아닌 document json 이기 때문에 내 domain 에 field 를 하나 추가하면 된다. 지금 운영중인 DB 에 문서마다 field 의 차이가 있다.
비교
Search
MongoDB
RDBMS(MySQL)
collection
Open
collection
document
Open
record or row
field
Open
column
index
Open
index
result of query is cursor
Open
result of query record
Count6
Cursor
MongoDB 는 cursor 를 반환하는데 커서를 통해 반복적으로 실제 document 를 가져올 수 있다. 이렇게 하는 이유는 결과를 client server memory 에 모두 담아두지 않아도 처리할 수 있게 하기 위해서이다.
물론 cursor 를 읽을 때 마다 서버에서 바로 document를 가져오는것은 아니다.
A pointer to the result set of a query. Clients can iterate through a cursor to retrieve results. By default, cursors timeout after 10 minutes of inactivity. See Iterate a Cursor in the mongo Shell.
query 결과 set의 pointer 라고 한다. 마치 symbolic 와 같다. (C, C++을 공부했다면 무슨느낌인지 확 올듯)
즉 쿼리 결과 자체를 주면 메모리를 먹을테니 그 주소값을 주고, 필요할때 주소에 접근하여 query 의 result 를 확인하도록 하는것이다.
MongoDB 의 특징으로 다음을 언급한다.
1.
NoSQL
2.
Schema-free
3.
비 관계형 DB
NoSQL 의 정의는 sql 을 사용하지 않는것 이지만, https://www.simba.com/drivers/mongodb-odbc-jdbc/ 와 같은것을 사용하면 sql 과 비슷하게 통신할 수 있으며, FK 까지는 아니지만 DBF 와 같은 기능을 사용하면 document 간의 관계를 어느정도 설정할 수 있다.
그리고 Aggregation 을 사용하면 join 과 같은 기능도 구현이 가능하다.
이러한 이유로 SQL 과 NoSQL 의 경계는 서서히 허물어지고 있다.
심지어 MySQL 도 document DB 와 같은 object 형식으로 질의할 수 있다.
앞으로는 점점 이 차이가 줄어들지 않을까? 생각한다.
Query
insert
db.address.insert({ "state": "서울특별시", "city": "서대문구", "address": "홍제1동", "enabled": true });
JSON
update
db.address.update({ {address: "홍제1동"}, {$set: {enabled: false}, {multi: true} })
JSON
Update address set enabled = false where address = "홍제1동";
SQL
delete
db.address.remove( {_id: "5099803df3f4948bd2f98391"} )
JSON
delete from address where _id = "5099803df3f4948bd2f98391";
SQL
select
db.address.find( {address: "홍제1동"} )
JSON
select * from address where address = "홍제1동";
SQL
과연 MongoDB 를 사용해야 하는 이유는 무엇인가?
참고
Made with 💕 and Oopy