リレーショナルモデルをMongoDBに追加するのではなく(あなたの説明からわかるように、単一値フィールドで変換される列指向)、MongoDBのドキュメント指向アーキテクチャを活用して、スキーマ内のオブジェクト:
{
_id: ObjectId("5805d576adf2ac885283779a"),
// Name of the room
room_name: 'Hold Them Up',
// When the room was created
created_at: ISODate("2016-10-18T08:04:17.611Z"),
// The uptime of the room in seconds or any other unit
uptime: 2000,
// You could organize this as an object that contains values for
// each of the turning phases of the game to allow for better analytics
current_table_cards: {
flop: ["A", "B", "C"],
turn: "D",
river: "E"
},
// You could also keep track of previous table cards
table_cards_history: [
{
flop: ["A", "B", "C"],
turn: "D",
river: "E"
},
{
flop: ["E", "D", "C"],
turn: "B",
river: "A"
},
...
],
// You could use an array to store the players that are currently playing
// and save a history of their previous 5 hands for example
//
// To track the order of the players, you can either manipulate this array
// and consider the indices the order of the players, or you could define
// an order property on the objects inside this array
players: [
{
user_id: ObjectId("5805d576adf2ac8852837791"),
cash_amount: 3201,
position: 2,
win: 1,
loss: 0,
current_hand: ["E", "F"],
hands_history: [
["A", "B"],
["A", "A"],
...
]
},
{
user_id: ObjectId("5805d576adf2ac8852837792"),
cash_amount: 4288,
position: 1,
win: 2,
loss: 1,
current_hand: ["C", "D"],
hands_history: [
["A", "E"],
["B", "B"],
...
]
},
{
user_id: ObjectId("5805d576adf2ac8852837793"),
cash_amount: 2531,
position: 3,
win: 0,
loss: 2,
current_hand: ["A", "B"],
hands_history: [
["D", "D"],
["C", "C"],
...
]
},
...
],
// Blind information
small_blind: ObjectId("5805d576adf2ac8852837792"),
big_blind: ObjectId("5805d576adf2ac8852837791"),
blind_amount: 100
}
これにより、各部屋とプレーヤーのために追跡したい情報に応じて、より多くのフィールドを持つに終わる可能性があり、アプリケーションのためのちょうど出発モデルです。
たとえば、プレーヤの平均賭け金額を追跡したり、ブラインドが変更されたときにタイマーを設定することができます。しかし、これはこの質問の範囲を超えており、異なる議論です。
また、Sergio Tulentsevと彼のコメントに記載されているように、抽出する必要がある情報に基づいてデータモデルを最適化することは非常に重要です。したがって、アプリケーションの要件に基づいて、パフォーマンスを最適化するために、データモデルとクエリのアクセスパターンのバランスをとる必要があります。
「これをより良くするにはどうすればいいですか」 - これは悪いと思いますか? –
はい、私はそれがより良い@SergioTulentsevを行うことができると感じて – maria
良い点は何ですか?抽象的な "良い" –