noSQL-Webベースのゲームの有効なオプションですか?[閉まっている]


20

機会と退屈から、友人と私はウェブベースのゲームを作ることにしました。通常、私はジャンゴでウェブアプリをプログラムするので、これは私が作る最初の「ゲーム」です。

ゲームに同じフレームワークを使用することを選択しましたが、将来の要件とDB関連の問題を予測することができないため、データストレージについては完全にはわかりません。最近、noSQLの動きが勢いを増しているので、その領域について調べたいと思います。

したがって、次の質問があります。

  • noSQLデータストレージ(MongoDBなどのドキュメントベース)は、Webベースのゲームに適していますか?
  • MySQLなどの従来のRDBMSを使用して発生する可能性のある問題は何ですか?
  • ゲームプレイ中またはcronジョブなどの定期的なイベントで、MongoDBを使用するユーザー間でデータの一貫性を保証する方法は?

ゲームの概要:モンスターと戦い、アイテムなどを獲得する典型的なアドベンチャーゲーム。

  • アイテム、武器、ポーション、マップなど、一部のデータはすべてのプレーヤーで静的です。
  • プレーヤーに関連付けられたいくつかのデータ:インベントリ、メトリック(統計)、進行状況など
  • プレイヤーは他のプレイヤーの統計と状態を知る必要があるかもしれません
  • スケジュールされたタスクは特定の時間間隔で実行されます


1
いくつかのNoSQLデータベースとの問題は、イベントログのような巨大なデータセットに高速な方法で「設計」時に予期せぬ彼らはクエリを行うことができないということです。gamedev.stackexchange.com/q/4465/450 のNoSQLデータベースが同じが必要ですのでご注意ください通常のデータベースよりも通常のクエリインジェクションに対するテクニック。
ヘンドリックブルーマーマン

1
@nhnb:ポイントを言い換えると、「関係データにリレーショナルデータベースを使用し、オブジェクト/ドキュメントデータにオブジェクト/ドキュメントデータベースを使用する」という方法があります。残念ながら、ほとんどの人はモデリングについて経験したり、多くの時間をモデル化について考えたりしないと思います。

2
「NoSQLはWebベースのゲームの有効なオプションですか?」という質問に答えて 答えはイエスだと思います。NoSQLデータベースは、これまでにWebベースのゲーム(FarmVilleなど)で使用されており、多くの柔軟性を提供します。この質問の主な論点は、「どちらが優れているか(NoSQLまたはSQL)?」です。各システムには長所と短所がありますが、どちらも完全に正当なオプションです。あるシステムが他のシステムより優れている点の詳細なリストを探している場合は、プログラマーStackExchangeに費用を支払うことをお勧めします。:)
アリパトリック

回答:


21

noSQLデータベースはWebベースのゲームに適していますか?

絶対に!一般的に、非リレーショナルデータベース(MongoDBなど)は、データをモデル化する方法がより柔軟であり、リレーショナルデータベース(SQLなど)よりもパフォーマンスが高いため、ゲームにとってはるかに優れています。選択。

従来のRDBMSを使用して発生する可能性のある問題は何ですか?

リレーショナルデータベースの使用には、2つの大きな欠点があります。

  • データのモデル化方法の柔軟性の欠如
  • 性能

リレーショナルデータベースを使用すると、モデルのニーズに対応するデータベースではなく、データベースのニーズに合わせてデータをモデル化する必要があるため、データをモデル化する方法に柔軟性がないことが大きな欠点です。たとえば、リレーショナルデータベースを使用してゲームにアイテムを保存する方法のモデルを作成し、次のモデルを決定するとします。

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を使用してどのようにモデル化しますか?
プラン

4
-1、答えは静的データのみを示します。ゲームデータベースのSQLとNoSQLをめぐる議論には、非常に動的なデータが関係しています。最善の方法は、2人のプレイヤー間で何かを交換するNoSQLトランザクションを表示することです。これは非常に一般的なことで、選択するタイプに関係なくほとんどのゲームが間違っています。

3
@Ari:より多くの静的データがありますが、誰も書き込みを行わないため、書き込みのスループットを気にしません-書き込み、トランザクション、ACID、実際のデータベースの質問、たとえそれを保存してもひとつに。その質問は簡単に答えられます-ただそれをメモリに保管してください。確かに「どうすれば静的データをより速く読み込むことができますか?」は興味深い質問ですが、SQLとNoSQLの質問にはまったく関係ないと思います。-マルチドキュメント操作に関して、これはデータベースに1つのドキュメントがあり、たとえばすべてのプレーヤーが含まれているということですか?

2
@Ari:アイデアであるNoSQLと特定のデータベースであるMongoDBを混同しないでください。私の最後の仕事で、NoSQLデータベースで2つのゲームを出荷し、低遅延で優れた同時実行性を得まし。しかし、NoSQLデータベースは、フィールドレベルのロックを使用したマルチドキュメントトランザクションもサポートしていました。NoSQLはSQLのような単一の「もの」ではなく、SQLを使用しない(そして通常はリレーショナルスキームを使用しない)データベースを指します。

5
ちょうど私の$ .02ですが、「パフォーマンスが良くない」ことはRDBMSの欠点ではありません。非リレーショナルデータをRDBMSに格納すること、RDBMSをチューニングしないこと、SQLの動作を理解しないこと、インデックス付けなどを行わないことなどの欠点です。リレーショナルデータがある場合、RDBMSは非常に最適化されていることがわかります。
ロビー

19

いくつかの単語がSQLデータベースを保護します。

1-SQLデータベースがある場合は、主キーだけでなくデータを操作できます。MMOのクエリのほとんどはPKによって実行されますが、レベルが30を超えるすべてのユーザーを見つける必要がある場合、NoSQLの世界では何をしますか?

2-SQL言語を使用している場合、破損したデータを修復するための「修正プログラム」を作成できます。たとえば、「player_items set flag = 0 where item_type_id = 100」を更新します。NoSQLでこれをどのように修正できますか?すべてのデータを解析するスクリプトを作成する必要があると思います...

3-SQLデータベースは、考えられるほど遅くありません。私の同僚は、MySQLで毎秒5000トランザクションを行うWebベースのMMOゲームを作成します。あなたには十分ではありませんか?そうでない場合は、シャーディングを使用してデータベースをスケーリングできます。

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では、独自の制約を記述する必要がありますが、これは柔軟性を高めるためのコストです。
アリパトリック

2
私はあなたの二度の考え方に同意します。それは、この質問で私がここでやっていることの一部です:)
Pran

10
SQLはスライバーの弾丸ではありません。NoSQLは特効薬ではありません。テクノロジーを使用する前によく考えてください。
ストーンメタル

5
3に関しては、問題はSQLであることをそんなにないが遅いが、SQLはあることをラグ。一般的に、SQLデータベースはレイテンシーを犠牲にして優れたスループットを実現します。Webベースのゲームの場合、おそらくそれがあなたの望むものです!リアルタイムネットワークゲームの場合、おそらくそうではなく、SQLを使用するほとんどの「WoWに似た」MMOはその前にキャッシングレイヤーを使用し、SQLの利点のほとんどを削除するため、NoSQLは大きな一歩です。それら。

18

答えはイエスです、それは有効なオプションですが、いや、それはおそらく素晴らしいアイデアではありません

ゲームに関しては、NoSQLが対処しようとするSQLには2つの大きな問題があります。

1つ目は、待ち時間、つまり遅延です。ある意味では、SQLデータベースは非常に高速であり、数千以上のトランザクションを10分の1秒で処理します。別の意味では、わずかなトランザクションの処理に同じ時間がかかる可能性があるため、非常に遅いです。ほとんどのデータベースの使用では、これは重要ではありませんが、ゲームにはリアルタイムコンポーネントがあるため、1秒あたりに実行できるトランザクションの数だけでなく、データベーストランザクションに応答するのにかかる平均時間も重要です。

この遅延は、リアルタイムゲームの大きな問題です。大規模なデータベース(通常はMMO用)を必要とする多くの開発者は、これらのストールを回避するためにデータベースとゲームサーバーの間にキャッシュ層を構築し、定期的にキャッシュをフラッシュします。問題?データベースを使用する主な理由- 原子性、一貫性、分離、および耐久性 -を捨てました。

しかし、その問題はWebゲームには当てはまりません。プレーヤーとゲームとの間に高遅延接続が既にあるので、SQLが提供するスループットと、成熟した有名なソフトウェアの利点を得ることができます。

ただし、2番目の問題はあなたに当てはまります。それは、オブジェクトとリレーショナルのインピーダンスの不一致です。ゲームはオブジェクトを扱い、データベースは行を扱います。運が良ければ、フィールドをリストするだけでオブジェクトを行にすることができますが、ほとんどの場合、オブジェクトは階層的であり、何らかの方法でそれらをフラットにして行にする必要があります。

CouchDBやMongoDBなどのドキュメントベースのデータベースは、ドキュメントを行ではなくトップレベルのオブジェクトに昇格させることでこの問題を解決します(この場合の「ドキュメント」は「オブジェクト」の同義語です)。しかし、これを行うと、SQLデータベースの多くの利点が失われます。スループットははるかに低く、ロックアルゴリズムはより複雑になります。

良いニュースは、あるオブジェクトリレーショナルマッピング(ORM)の多くが既に存在している、使用しているどんな言語で利用可能なツールが。メモリ内のオブジェクトとデータベース内の行をかなり透過的に変換できます。これらのツールは、SQLおよびNoSQLデータベースの最悪のパフォーマンスを示す可能性があるため、一般に大規模なリアルタイムゲームには適していません。ただし、Webゲームには問題ありません。最悪の場合、パフォーマンスの問題が発生した場合は、昔ながらの方法でトランザクションに戻ることができます。遅延の問題はあなたを傷つけず、スループットの増加はあなたを助けます。

最後に、私が他の場所で行った点を説明するためにこれは静的なゲームデータに関するものではありません。ここでは、アイテムの説明、武器の損傷、スプライトなどについては説明していません。つまり、プレーヤーのインベントリにあるデータや統計情報など、実際の変更可能なゲームデータを意味します。静的データに必要なのはデータストアのみです。たぶん、ORMが優れているため、そのための最も簡単なことは、データストアと同じデータベースを使用することであることがわかります。たぶん、ファイルシステムだけが必要になるでしょう。それは2つの別個の問題であり、1つの答えは両方のケースに当てはまる必要はありません(おそらく当てはまりません)。


1
+1両方のオプションを比較してくれてありがとう。さらに、静的データをデータベースに入れてはいけないと言うことで良い点を挙げます。
プラン

1
+1ただし、No SQLの主な長所(見方によっては賛否両論)の1つに言及することを怠ると思います。リレーショナルモデルにうまく収まるものにはPostgreSQLを使用した現在のプロジェクトと、収まらない半静的なものにはMongoの両方を実際に使用します。(たとえば、リプレイを生成するために使用できるログ。他の多くのテーブルの
つからの

1
@ Davy88:noSQLは必ずしもスキーマレスではなく、「非常に動的な」データベースを持つことは実際にはプラスではありません。データスープしか持っていない場合、インデックス付けもフィールドレベルのロックもできません。また、キーが存在しない場合はどうなるのかという質問で、単純なクエリでも困惑します。

@ user744、あなたが言及したものは何を達成しますか?
期限切れの忍者

5
  • noSQLデータストレージ(MongoDBなどのドキュメントベース)は、Webベースのゲームに適していますか?

couchdbをご覧になることをお勧めします

そのインターフェイスはjavascriptベースであるため、HTML5 / javascriptベースのゲームと非常によく調和します。

また、「オフライン」で作業して(dbのローカルコピーを作成)、後でサーバーと同期することもできます(たとえば、これをインスタンス化されたダンジョンに使用できます)

  • MySQLなどの従来のRDBMSを使用して発生する可能性のある問題は何ですか?

主な問題は、no-sqlデータベースがリレーショナルデータベースとはかなり異なる方法で処理することです。メンタルスイッチングを行うのは難しい場合があります。

たとえば、couchdbで「クエリ」がどのように行われるかを見てみましょう。すべてがJavaScriptで行われます。

  • ゲームプレイ中またはcronジョブなどの定期的なイベントで、MongoDBを使用するユーザー間でデータの一貫性を保証する方法は?

データベースを「同期」するプロセスは、couchdbの用語では複製と呼ばます。一貫性という用語も多く見られます。レプリケーションと一貫性を処理する組み込みサービスがいくつかあります。たとえば、増分複製プロセスを参照してください。


はい、couchdbについても聞いたことがあります。実際、mongodbのWebサイトでも、彼らは一般的にそれと比較しています。私はcouchdb対mongodbについて研究する必要があると思います。
プラン

2

ゲームの内容によっては、両方を使用し、ゲームのモデルを介してそれらを接続することになります。たとえば、プレーヤーはRDB(ログイン情報)にある可能性がありますが、プレーヤーインベントリ/変数ストレージはnoSQLに移動できるため、プレーヤーモジュールはlogin()RDBとfetchInventory()使用し、プライマリキーでnoSQL使用ます。

たとえば、NoSQLに保存する方が良いマップ(たとえば、座標=>さまざまなオブジェクトの配列)RDBに領域の内容を保存することは考えられません(シリアル化された文字列を除く。 RAMが無駄になります!)たとえば、エリア "city X"には次の座標/ブロック([3,4]、[8,7] ...)が含まれます。

両方を使用することができ、おそらく使用する必要があり、必要なmemcacheなどの揮発性ストレージまたは一時データを調べます(確かにハードディスクを使用するよりも高速です!多くのCPUを節約しますが、RAMは節約しません)

最後に>

それはあなたがゲームに何を持ちたいかに依存します!元気


私が考えているように、どの機能がNoSQLまたは永続層にあなたをより引き付けると思いますか?
期限切れの忍者

1
urゲームがgpsベースの場合は座標システムかもしれませんが、高度な検索が必要な場合があります。基本的に、MySQLが上手く機能していれば、nosqlとしても使用できますか
Ronan Dejhero
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.