대답은 예입니다. 유효한 옵션 이지만 아니요, 아마도 좋은 생각은 아닙니다. .
게임과 관련하여 NoSQL이 해결하려고하는 SQL에는 두 가지 주요 문제가 있습니다.
첫 번째는 대기 시간 또는 지연입니다. 어떤 의미에서, SQL 데이터베이스는 엄청나게 빠르며 수십 분의 1 초 안에 수천 건 이상의 트랜잭션을 처리합니다. 다른 의미에서, 단지 몇 개의 트랜잭션 만 처리하는 데 같은 시간이 걸리기 때문에 매우 느립니다. 대부분의 데이터베이스 사용의 경우 이것은 중요하지 않지만 게임에는 실시간 구성 요소가 있으므로 초당 수행 할 수있는 트랜잭션 수뿐만 아니라 데이터베이스 트랜잭션에 응답하는 데 걸리는 평균 시간에 관한 것입니다.
이 지연 시간은 실시간 게임의 주요 문제입니다. 큰 데이터베이스 (보통 MMO 용)를 필요로하는 많은 개발자는 이러한 중단을 피하기 위해 데이터베이스와 게임 서버 사이에있는 캐싱 계층을 구축 한 다음 캐시를 주기적으로 플러시합니다. 문제? 데이터베이스 원 자성, 일관성, 격리 및 내구성 을 사용해야하는 주된 이유를 방금 배제했습니다 .
그러나이 문제는 웹 게임에는 적용되지 않습니다.플레이어와 게임 사이에 대기 시간이 길어 졌으므로 SQL이 제공하는 처리량과 성숙하고 잘 알려진 소프트웨어의 이점을 얻을 수 있습니다.
그러나 두 번째 문제는 당신에게 적용되며, 그것은 객체 관계형 임피던스 불일치입니다 입니다. 게임은 객체, 데이터베이스는 행을 처리합니다. 운이 좋으면 필드를 나열하여 객체를 행으로 만들 수 있지만 대부분의 경우 객체는 계층 구조이므로 행으로 가져 오기 위해 어떤 식 으로든 평면화해야합니다.
CouchDB 및 MongoDB와 같은 문서 기반 데이터베이스는 문서를 행이 아닌 최상위 개체로 승격시켜이 문제를 해결합니다 (이 경우 "document"는 "object"의 동의어 임). 그러나 이렇게하면 SQL 데이터베이스의 많은 이점을 잃게됩니다. 처리량이 훨씬 낮아지고 잠금 알고리즘이 훨씬 더 복잡해집니다.
좋은 소식은 이미 많은 객체 관계형 매핑 (ORM)이 있다는 것입니다. 사용중인 언어에 사용할 수 도구가 있다는 것입니다. 메모리의 객체와 데이터베이스의 행 사이를 상당히 투명하게 번역 할 수 있습니다. 이러한 도구는 일반적으로 대규모 실시간 게임에는 적합하지 않습니다. SQL 및 NoSQL 데이터베이스의 성능이 최악 일 수 있기 때문입니다. 그러나 웹 게임에는 문제가 없습니다. 최악의 경우 성능 문제가 발생하면 구식 방식으로 트랜잭션을 수행 할 수 있습니다. 지연 시간 문제는 당신을 해치지 않으며 처리량 증가가 도움이됩니다.
마지막으로, 나는 다른 곳에서 변경 한 점을 장황하게합니다 : 이것은 정적 인 게임 데이터에 대해 아닙니다. 아이템 설명이나 무기 손상, 스프라이트 또는 여기에 대해 이야기하고 있지 않습니다. 플레이어의 인벤토리에 있거나 통계와 같은 실제적이고 변경 가능한 게임 데이터를 의미합니다. 정적 데이터에 필요한 것은 데이터 저장소입니다. 아마도 가장 쉬운 방법은 훌륭한 ORM을 가지고 있기 때문에 데이터 저장소와 동일한 데이터베이스를 사용하는 것입니다. 어쩌면 파일 시스템이 필요할 것입니다. 그것은 두 가지 별도의 문제이며, 하나의 대답은 두 경우 모두에 맞을 필요는 없으며 아마도 적합하지 않을 수도 있습니다.