RDBMS 선정 과정
1. 내가 사용하려는 DB의 구조를 파악하자 - ERD 다이어그램 작성
RDBMS를 선정하기에 앞서, 어떤 데이터를 어떤 구조로 저장할지 생각해야 한다. 현업에서는 Entity-Relation Diagram(ERD)라는 기법으로 DB의 큰그림을 그리고 있었다.
위키 사전 https://ko.wikipedia.org/wiki/%EA%B0%9C%EC%B2%B4-%EA%B4%80%EA%B3%84_%EB%AA%A8%EB%8D%B8 데브시스터즈의 쿠키런 설계 프로젝트 쉐어 https://www.slideshare.net/_ce/db-42498020
ERD를 그리는 다양한 제품이 있었는데, 무료로 온라인에서 간단하게 ERD를 그려볼 수 있는 툴이 있어 사용해보았다. http://aquerytool.com/ 이곳에서 사용할 수 있다.
다이어그램을 그린 결과, 두 가지 설계 이슈를 찾아낼 수 있었다.
성능 이슈
- Foreign key 사용이 많음
테이블에 여러 컬럼들이 담길 때, 두 가지 선택을 할 수 있다.
하나는 테이블의 컬럼들을 따로 테이블로 쪼개는 정규화, 다른 하나는 테이블을 통으로 사용하는 비정규화다.
테이블을 나눌 경우 테이블을 통으로 사용할 때 사용하지 않는 컬럼까지 불러오게 되는 오버헤드를 방지할 수 있지만, JOIN 문을 자주 사용하기 때문에 CPU에 오버헤드가 생길 수 있다. (어떤 하드웨어에 부하가 생기는지 탐구할 것)
반면에 테이블을 통으로 사용한다면 JOIN 문을 사용하지 않고 단순한 쿼리로 데이터를 불러올 수 있겠으나, 쓸데없는 컬럼을 불러오는 것으로 인한 오버헤드가 생긴다. 서버의 I/O가 느리다면 문제가 생길 수 있다.
-> DB 구조에 따른 성능 비교도 벤치마크해볼 가치가 있구나!
- Update 위주의 쿼리 사용
- Row를 한 개씩 자주 호출(point query)
웹 사이트나 앱에서는 게시판처럼 여러 게시물을 SELECT로 가져오곤 한다.
그러나 게임에서는 아이템/골드의 획득 및 거래/레벨업 등 SELECT 보다는 UPDATE를 쓸 일이 많다.
또한 캐릭터 하나 하나에 대한 정보를 수정하게 되므로 한 개의 Row를 자주 호출하게 된다. 이를 포인트 쿼리라고 한다.
안정성 이슈
-
정확한 트랜잭션 필요(아이템 거래, 획득 등)
-
데이터 백업 및 복구 기능 필요(아이템 / 골드 / 캐릭터 정보 등)
2. RDBMS 선정 기준
위의 두 이슈로부터 선정 기준을 생각할 수 있었다.
-
QUERY 성능 : JOIN+SELECT/UPDATE 2. 대량의 포인트 쿼리에 대한 성능
-
트랜잭션 정확도를 보장하는가 4. 백업 및 복구 기능을 지원하는가?
-
무자본 개발자가 앱 출시를 위해 사용할 수 있는가?
3~5번은 제품 설명에서 파악이 가능하니까 이것을 먼저 살펴보고, 1차 선정 후에 1, 2번을 벤치마크로 비교한다.
3. 어떤 RDBMS 제품들이 있는가?
db 랭킹 사이트 - 인기순위 보여줌. 상업 / 오픈소스 별 랭킹도 확인 가능. https://db-engines.com/en/ranking
블로그 레벨 분석 참고자료 https://m.blog.naver.com/PostView.nhn?blogId=babo9880&logNo=110153517784&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
mySQL
mariaDB
postgreSQL
Ms SQL server
MS Access SQLite
IBM DB2
Oracle DB
Sybase
Teradata?
- RDBMS는 제품도 많지만, RDBMS 성능 측정을 위한 벤치마크 툴도 수없이 많았다.
어떤 제품을 어떻게 벤치마크할지 신중히 검토할 것.
위키에만 수십 개의 RDBMS 제품 존재 https://en.wikipedia.org/wiki/List_of_relational_database_management_systems#Current
RDBMS와 noSQL http://www.ciokorea.com/tags/1714/RDBMS/38041