noSQL-웹 기반 게임에 유효한 옵션입니까? [닫은]


20

기회와 권태로 친구와 나는 웹 기반 게임을 만들기로 결정했습니다. 이것은 내가 장고에서 웹 응용 프로그램을 프로그래밍하기 때문에 내가 만들 첫 번째 '게임'입니다.

게임에 동일한 프레임 워크를 사용하기로 선택했지만 향후 요구 사항 및 DB 관련 문제를 예측할 수 없으므로 데이터 스토리지에 대해 완전히 확신하지 못합니다. 최근에 noSQL 운동이 힘을 얻고 있으며 그 분야를 탐구하고 싶습니다.

따라서 다음과 같은 질문이 있습니다.

  • noSQL 데이터 스토리지 (MongoDB와 같은 문서 기반)가 웹 기반 게임에 적합할까요?
  • MySQL과 같은 일반적인 RDBMS를 사용하여 발생할 수있는 문제는 무엇입니까?
  • MongoDB 사용자, 게임 플레이 중 또는 크론 작업과 같은 정기 이벤트에서 데이터 일관성을 보장하는 방법은 무엇입니까?

게임 개요 : 플레이어가 몬스터와 싸우고 아이템을 얻는 등 일반적인 모험 게임.

  • 일부 데이터는 아이템, 무기, 물약,지도 등 모든 플레이어에서 정적입니다.
  • 플레이어와 연결된 일부 데이터 : 인벤토리, 메트릭 (통계), 진행률 등
  • 플레이어는 다른 플레이어의 통계와 상태를 알아야 할 수도 있습니다
  • 예약 된 작업은 특정 시간 간격으로 실행됩니다


1
일부되는 NoSQL 데이터베이스에 대한 문제는 쿼리를 할 수없는 이벤트 로그와 같은 큰 데이터 세트에 대한 빠른 방법으로 "디자인"시간에 예상치 못한입니다 : gamedev.stackexchange.com/q/4465/450이 되는 NoSQL 데이터베이스가 동일을 요구 것을 명심하시기 바랍니다 일반 데이터베이스보다 정상적인 쿼리 삽입에 대한 기술.
Hendrik Brummermann

1
@nhnb : 요점을 회복하는 좋은 방법 중 하나는 "관계 데이터에 관계형 데이터베이스를 사용하고 개체 / 문서 데이터에 개체 / 문서 데이터베이스를 사용하는 것"입니다. 불행히도 나는 대부분의 사람들이 모델링에 대해 경험이 있거나 모델링에 대해 많은 시간을 소비한다고 생각하지 않습니다.

2
귀하의 질문에 대한 답변으로 "NoSQL은 웹 기반 게임에 유효한 옵션입니까?" 나는 대답이 그렇다고 믿는다. NoSQL 데이터베이스는 이전의 웹 기반 게임 (예 : FarmVille)에 사용되었으며 많은 유연성을 제공합니다. 이 질문에 대한 논쟁의 주요 요점은 "어느 쪽이 더 좋은가 (NoSQL 또는 SQL)"인 것 같습니다. 각 시스템에는 장단점이 있지만 두 가지 모두 완벽하게 합법적 인 옵션입니다. 한 시스템의 장점과 다른 시스템의 장점에 대한 자세한 목록을 보려면 Programmers StackExchange에 vist를 지불하십시오. :)
Ari Patrick

답변:


21

noSQL 데이터베이스가 웹 기반 게임에 적합합니까?

전혀! 일반적으로 비 관계형 데이터베이스 (예 : MongoDB)는 관계형 데이터베이스 (예 : SQL)보다 성능이 뛰어나면서 데이터를 모델링하는 방법이 더 유연하므로 게임에 훨씬 좋습니다. 선택.

기존 RDBMS를 사용하여 발생할 수있는 문제는 무엇입니까?

관계형 데이터베이스 사용에는 두 가지 주요 단점이 있습니다.

  • 데이터 모델링 방식의 유연성 부족
  • 공연

관계형 데이터베이스를 사용하면 모델의 요구를 수용하는 데이터베이스가 아니라 데이터베이스의 요구에 맞게 데이터를 모델링해야하기 때문에 데이터 모델링 방식의 유연성 결여가 큰 단점입니다. 예를 들어 관계형 데이터베이스를 사용하여 게임에 항목을 저장하는 방법에 대한 모델을 작성하고 다음 모델을 결정한다고 가정하십시오.

weapon_type_id | weapon_type
1 | sharp

weapon_id | weapon| weapon_type_id | damage
1 | Short Sword | 1 | 5

potion_type_id | potion_type
1 | HP
2 | Mana

potion_id | potion| potion_type_id | modifier
1 | Healing Elixer | 1| 5
2 | Mana Drainer | 2| -5

이제 다음을 수행하기 위해 모델을 수정하는 방법을 고려하십시오.

  • 새로운 아이템 타입 추가
  • 여러 종류의 무기로 무기 만들기
  • 무기로도 사용할 수있는 물약 아이템 만들기

확실히이 모든 행동들이 가능하지만, 당신이 그 일을하는 동안 가장 행복한 사람이되지 않을 것입니다. 비 관계형 데이터베이스에서 훨씬 유연한 모델을 설계합니다.

참고 : 문서 기반 데이터베이스가 정보를 저장하는 방법에 익숙하지 않은 경우 계속하기 전에이 링크 를 확인하십시오 . 아래 제시된 모델은 앞에서 언급 한 기사와 비슷한 논리를 사용하도록 설계되었습니다.

db.itemTypes

name: Weapon
types: Sharp

name: Potion
types: HP, Mana

db.items

name: Short Sword
weapon
    type: Sharp (db.itemTypes reference)
    damage: 5

name: Healing Elixer
potion
    type:  HP (db.itemTypes reference)
    modifier: 5

name: Mana Drainer
potion
    type:  Mana (db.itemTypes reference)
    modifier: -5  

name:  Healing Potion Sword
potion
    type: HP (db.itemTypes reference)
    modifier: 10
weapon
    type: Sharp (db.itemTypes reference)
    damage: 15

NoSQL과 SQL 데이터베이스의 성능에 대한 좋은 기사가 많이 있지만 여기에는 자체 테스트를 수행 할 수있는 응용 프로그램 예제를 제공하는 기사가 있습니다. MongoDB와 SQL Server 2008 성능 대결

MongoDB 사용자간에 데이터 일관성을 유지하려면 어떻게합니까?

MongoDB는 단일 데이터 엔터티 (문서)에 대한 읽기 / 쓰기 원자 작업을 지원하므로 MongoDB의 쿼리 결과는 데이터베이스에 저장된 내용과 항상 정확해야합니다.

편집 : 항목 데이터베이스의 NoSQL 예제 제공


sql을 사용하여 작성한 예제에서 nosql을 사용하여 어떻게 높은 수준으로 모델링하겠습니까?
Pran

4
-1, 당신의 대답은 정적 데이터만을 보여줍니다. 게임 데이터베이스에 대한 SQL과 NoSQL에 대한 모든 토론에는 매우 역동적 인 데이터가 필요합니다. 가장 좋은 방법은 두 플레이어 사이에서 거래하는 NoSQL 트랜잭션을 보여주는 것입니다. 매우 흔한 일이며, 선택한 게임 유형에 관계없이 대부분의 게임이 잘못됩니다.

3
@Ari : 더 많은 정적 데이터가 있지만, 쓰기, 트랜잭션, ACID, 실제 데이터베이스 질문 등 데이터를 저장하지 않더라도 쓰기 작업 처리량에 신경 쓰지 않습니다. 하나의. 그런 다음 그 질문에 대답하기가 쉽습니다. 그냥 기억해 두십시오. "정적 데이터를 더 빠르게로드 할 수있는 방법은 무엇입니까?" 흥미로운 질문이지만 SQL과 NoSQL의 질문과 관련이 있다고 생각하지 않습니다. 다중 문서 작업의 경우 데이터베이스에 모든 플레이어가 포함 된 하나의 문서가 데이터베이스에 포함되어 있습니까?

2
@Ari : 아이디어 인 NoSQL과 특정 데이터베이스 인 MongoDB를 혼동하지 마십시오. 마지막 작업에서 우리는 NoSQL 데이터베이스에 두 개의 게임을 출시했으며 대기 시간이 짧은 우수한 동시성을 얻었습니다 . 그러나 NoSQL 데이터베이스는 필드 레벨 잠금 기능이있는 다중 문서 트랜잭션도 지원했습니다. NoSQL은 SQL과 같은 단일 "사물"이 아니며 SQL을 사용하지 않는 데이터베이스 (일반적으로 관계형 스키마를 사용하지 않는 데이터베이스)를 나타냅니다.

5
단지 $ .02이지만 "성능이 아님"은 RDBMS의 단점이 아닙니다. 비 관계형 데이터를 RDBMS에 저장하지 않고 RDBMS를 튜닝하지 않고 SQL이 수행하는 작업을 이해하지 못하거나 인덱싱 등을하지 않는 등의 단점이 있습니다. 관계형 데이터가있는 경우 RDBMS가 엄청나게 최적화됩니다.
로비

19

몇 단어는 SQL 데이터베이스를 방어합니다.

1-SQL 데이터베이스가있는 경우 기본 키뿐만 아니라 데이터로 작업 할 수 있습니다. MMO에서 대부분의 쿼리는 PK를 사용하지만 30보다 큰 레벨을 가진 모든 사용자를 찾아야 할 때 NoSQL 세계에서 무엇을 하시겠습니까?

2-SQL 언어가있는 경우 "핫픽스"를 작성하여 손상된 데이터를 복구 할 수 있습니다. 예 : "update player_items set flag = 0 여기서 item_type_id = 100"입니다. NoSQL에서이 문제를 어떻게 해결할 수 있습니까? 모든 데이터를 파싱하는 스크립트를 만들어야한다고 생각합니다 ...

3-SQL 데이터베이스는 생각만큼 느리지 않습니다. 내 동료는 웹 기반 MMO 게임을 만들고 MySQL에서 초당 5000 트랜잭션을 만듭니다. 당신에게 충분하지 않습니까? 그렇지 않은 경우 샤딩을 사용하여 데이터베이스를 확장 할 수 있습니다.

4-SQL에는 외래 키 제약 조건과 같은 좋은 점이 있으므로 코드에서 버그를 찾는 데 도움이됩니다.

NoSQL은 은총 알이 아닙니다. 몇 가지 문제 만 해결하고 많은 새로운 문제가 발생합니다. 내 충고-NoSQL을 선택하기 전에 두 번 생각하십시오.


1
이것이 실제로 필요할 때까지 NoSQL을 피하는 좋은 이유입니다. 특히 # 3. 이미 수십억 명의 사용자가 없다면 (그리고 샤딩을 거부하지 않는 한), MySQL을 사용하면 훨씬 더 생산적 일 것입니다.
ojrac

5
1. "db.user.find ({"level ": {"$ gt ": 30}})에서 x의 경우"를 사용합니다. 2. 기술적으로 작성한 내용도 스크립트이므로 당신의 요점이 무엇인지 확실하지 않습니다. 3. SQL을 사용하여 MMO를 만드는 것은 매우 가능하며 실제로이 기술을 사용하여 많은 MMO가 개발되었습니다. NoSQL 기술은 상당히 새롭고 성능과 유연성을 위해 Amazon, Google 및 Facebook과 같은 서비스에서 이미 채택되었습니다. 4. NoSQL에서는 고유 한 제약 조건을 작성해야하지만 유연성이 추가되는 비용입니다.
Ari Patrick

2
나는 당신의 생각의 진술에 두 번 동의합니다. 그건 내가 :)이 질문에 여기서 뭐하는 거지 부분입니다
프란

10
SQL은 은총 알이 아닙니다. NoSQL은 은총 알이 아닙니다. 기술을 사용하기 전에 두 번 생각하십시오.
stonemetal

5
3과 관련하여, 문제는 너무 많은 SQL인지하지 천천히 ,하지만 SQL은이다 랙이 . 일반적으로 SQL 데이터베이스는 대기 시간을 희생하면서도 뛰어난 처리량을 얻습니다. 웹 기반 게임의 경우 아마도 당신이 원하는 것입니다! 실시간 네트워크 게임의 경우 SQL을 사용하지 않는 대부분의 "와우"MMO는 SQL 앞에 캐싱 레이어를 사용하여 SQL의 이점을 대부분 제거하므로 NoSQL이 크게 발전한 이유입니다. 그들.

18

대답은 예입니다. 유효한 옵션 이지만 아니요, 아마도 좋은 생각은 아닙니다. .

게임과 관련하여 NoSQL이 해결하려고하는 SQL에는 두 가지 주요 문제가 있습니다.

첫 번째는 대기 시간 또는 지연입니다. 어떤 의미에서, SQL 데이터베이스는 엄청나게 빠르며 수십 분의 1 초 안에 수천 건 이상의 트랜잭션을 처리합니다. 다른 의미에서, 단지 몇 개의 트랜잭션 만 처리하는 데 같은 시간이 걸리기 때문에 매우 느립니다. 대부분의 데이터베이스 사용의 경우 이것은 중요하지 않지만 게임에는 실시간 구성 요소가 있으므로 초당 수행 할 수있는 트랜잭션 수뿐만 아니라 데이터베이스 트랜잭션에 응답하는 데 걸리는 평균 시간에 관한 것입니다.

이 지연 시간은 실시간 게임의 주요 문제입니다. 큰 데이터베이스 (보통 MMO 용)를 필요로하는 많은 개발자는 이러한 중단을 피하기 위해 데이터베이스와 게임 서버 사이에있는 캐싱 계층을 구축 한 다음 캐시를 주기적으로 플러시합니다. 문제? 데이터베이스 원 자성, 일관성, 격리 및 내구성 을 사용해야하는 주된 이유를 방금 배제했습니다 .

그러나이 문제는 웹 게임에는 적용되지 않습니다.플레이어와 게임 사이에 대기 시간이 길어 졌으므로 SQL이 제공하는 처리량과 성숙하고 잘 알려진 소프트웨어의 이점을 얻을 수 있습니다.

그러나 두 번째 문제는 당신에게 적용되며, 그것은 객체 관계형 임피던스 불일치입니다 입니다. 게임은 객체, 데이터베이스는 행을 처리합니다. 운이 좋으면 필드를 나열하여 객체를 행으로 만들 수 있지만 대부분의 경우 객체는 계층 구조이므로 행으로 가져 오기 위해 어떤 식 으로든 평면화해야합니다.

CouchDB 및 MongoDB와 같은 문서 기반 데이터베이스는 문서를 행이 아닌 최상위 개체로 승격시켜이 문제를 해결합니다 (이 경우 "document"는 "object"의 동의어 임). 그러나 이렇게하면 SQL 데이터베이스의 많은 이점을 잃게됩니다. 처리량이 훨씬 낮아지고 잠금 알고리즘이 훨씬 더 복잡해집니다.

좋은 소식은 이미 많은 객체 관계형 매핑 (ORM)이 있다는 것입니다. 사용중인 언어에 사용할 수 도구가 있다는 것입니다. 메모리의 객체와 데이터베이스의 행 사이를 상당히 투명하게 번역 할 수 있습니다. 이러한 도구는 일반적으로 대규모 실시간 게임에는 적합하지 않습니다. SQL 및 NoSQL 데이터베이스의 성능이 최악 일 수 있기 때문입니다. 그러나 웹 게임에는 문제가 없습니다. 최악의 경우 성능 문제가 발생하면 구식 방식으로 트랜잭션을 수행 할 수 있습니다. 지연 시간 문제는 당신을 해치지 않으며 처리량 증가가 도움이됩니다.

마지막으로, 나는 다른 곳에서 변경 한 점을 장황하게합니다 : 이것은 정적 인 게임 데이터에 대해 아닙니다. 아이템 설명이나 무기 손상, 스프라이트 또는 여기에 대해 이야기하고 있지 않습니다. 플레이어의 인벤토리에 있거나 통계와 같은 실제적이고 변경 가능한 게임 데이터를 의미합니다. 정적 데이터에 필요한 것은 데이터 저장소입니다. 아마도 가장 쉬운 방법은 훌륭한 ORM을 가지고 있기 때문에 데이터 저장소와 동일한 데이터베이스를 사용하는 것입니다. 어쩌면 파일 시스템이 필요할 것입니다. 그것은 두 가지 별도의 문제이며, 하나의 대답은 두 경우 모두에 맞을 필요는 없으며 아마도 적합하지 않을 수도 있습니다.


1
+1 두 옵션을 비교해 주셔서 감사합니다. 또한 정적 데이터가 데이터베이스에 있으면 안된다는 말을 통해 좋은 지적을 할 수 있습니다.
Pran

1
+1 그러나 No SQL의 주요 장점 (관점에 따라 장점, 장점 또는 단점) 중 하나는 언급하지 않는 것이 좋습니다. 스키마가 적기 때문에 매우 동적 인 데이터를 저장할 수 있습니다. 실제로 현재 프로젝트에 PostgreSQL을 사용하여 관계형 모델에 잘 어울리는 물건을, 몽고는 반 정적 물건을 섞지 않을 것입니다. (예를 들어, 관계형으로 다른 많은 테이블 중 하나의 PK를 저장하는 열 또는 param1 param2와 같은 일반 열 이름을 가진 테이블을 가져야하는 리플레이를 생성하는 데 사용할 수있는 로그)
Davy8

1
@ Davy88 : noSQL은 스키마가 반드시 필요한 것은 아니며 "매우 동적 인"데이터베이스를 보유하는 것이 실제로 좋은 것은 아닙니다. 데이터 수프 만 있으면 인덱싱을 수행 할 수없고 필드 수준 잠금을 수행 할 수 없으며 간단한 쿼리조차도 키가 존재하지 않을 경우 발생하는 문제에 대한 질문으로 가득 차게됩니다.

@ user744, 언급 한 것들이 무엇을 성취합니까?
만료 된 닌자

5
  • noSQL 데이터 스토리지 (MongoDB와 같은 문서 기반)가 웹 기반 게임에 적합할까요?

couchdb를 살펴 보는 것이 좋습니다

인터페이스는 자바 스크립트 기반이므로 HTML5 / 자바 스크립트 기반 게임과 잘 어울립니다.

또한 '오프라인'(DB의 로컬 사본 만들기)으로 작업 한 다음 나중에 서버와 동기화 할 수 있습니다 (예를 들어 인스턴스 던전에 사용할 수 있음)

  • MySQL과 같은 일반적인 RDBMS를 사용하여 발생할 수있는 문제는 무엇입니까?

주요 이슈는 no-sql 데이터베이스가 관계형 데이터베이스와는 상당히 다르게 처리한다는 것입니다. 정신 전환을하는 것은 어려울 수 있습니다.

예를 들어 couchdb에서 " query "가 어떻게 수행 되는지 살펴 보십시오. 모든 것은 자바 스크립트로 이루어집니다.

  • MongoDB 사용자, 게임 플레이 중 또는 크론 작업과 같은 정기 이벤트에서 데이터 일관성을 보장하는 방법은 무엇입니까?

데이터베이스를 '동기화'하는 과정을 couchdb의 용어로 복제 라고 합니다 . 일관성 이라는 용어도 많이 볼 수 있습니다 . 복제 및 일관성을 다루는 몇 가지 기본 제공 서비스가 있습니다. 예를 들어 증분 복제 프로세스를 참조하십시오 .


예, couchdb에 대해서도 들었습니다. 사실 mongodb의 웹 사이트에서도 공통적으로 비교합니다. couchdb vs mongodb에 대해 조사해야한다고 생각합니다.
Pran

2

게임의 내용에 따라 둘 다 사용하고 게임의 모델을 통해 연결하게 될 수 있습니다. 예를 들어 player는 RDB (로그인 정보)에 있어야하지만 플레이어 인벤토리 / 변수 저장소는 noSQL로 갈 수 있으므로 플레이어 모듈은 login()RDB 및fetchInventory() 사용하고 기본 키로 noSQL을 사용할 있습니다.

예를 들어 NoSQL에 저장하는 것이 더 좋습니다 (좌표 => 다른 객체의 배열) RDB에 포함 된 영역을 저장하는 것을 상상하지 못합니다 (일련의 문자열을 제외하고 직렬화 된 문자열 제외). RAM이 낭비되었습니다!) RDB에 영역을 계속 저장할 수 있습니다. 예를 들어 "city X"영역에는 다음 좌표 / 블록이 포함되어 있습니다 ([3,4], [8,7] ...)

둘 다 사용할 수 있고 아마 사용해야 할 수도 있고 필요할 수있는 memcache 또는 임시 데이터와 같은 휘발성 저장소를 살펴보십시오 (하드 디스크를 사용하는 것보다 빠를 것입니다! 많은 CPU를 절약하지만 RAM은 아닙니다)

결국 결국>

그것은 당신이 게임에서 갖고 싶은 것에 달려 있습니다! 치어스


내가 생각하기에 어떤 기능을 NoSQL 또는 퍼시스턴스 레이어로 끌어들일 것이라고 생각하십니까?
만료 된 닌자

1
ur 게임이 GPS 기반이라면 고급 검색이 필요할 수있는 좌표 시스템 일 수 있습니다. 기본적으로 MySQL을 잘 사용한다면,이를 nosql
로도
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.