在我正在开展的假设项目中,有些用户可以玩游戏并设置高分,用户显示名称可以随时更改,但不允许重复。我计划使用MongoDB,因为它似乎支持比SQL替代品更快的开发。用户可以玩许多类型的游戏,所有游戏都有某种需要存储在数据库中的分数。然后需要对分数进行分数查询,以便建立高分数列表。来自SQL我可以这样做:
+------+-----------+
|UserID|DisplayName|
+------------------+
|883 |John02 |
|2321 |James55 |
|22 |Sam |
|943 |Joe |
+------+-----------+
+------+------+-----+
|GameID|UserID|Score|
+-------------------+
|1 |883 |9001 |
|3 |2321 |2 |
|2 |22 |1337 |
|2 |943 |998 |
+------+------+-----+
什么是Mongo的等价物?我是否像关系数据库那样考虑这个问题?
答案 0 :(得分:0)
你需要有两个馆藏,即用户,游戏。
注意:在mongodb中,表被称为集合。然后,将在mongodb中自动生成用户ID。您不需要用户ID的特定字段。
游戏属于用户。和用户has_many游戏。下面是在rails上使用ruby的代码片段。
class User
...
field :name
has_many :games
end
class Games
...
field :score
belongs_to :User
end
当您拥有这种架构时,您可以查询您的数据库以获取与用户相关的游戏,如下所示
usr = User.where(name:“some name”) usr.games.all =>返回与特定用户关联的所有游戏
任何疑问,请随时发表评论。
答案 1 :(得分:0)
这完全取决于您经常要进行的查询。例如,如果您的所有查询都与用户相关联,比如显示用户所播放的所有游戏,您可以保持这样的架构,用户集合将具有这样的文档,其中Games是嵌入子文档。
{
Id : "",
Name : "Test Name",
Games : [{ Id : 1 , Score : 1234 } , { Id : 2 , Score : 3456}]
}
但是这个架构的问题在于,现在如果你想搜索某个游戏最佳射手,那将会非常棘手,但我们可以在另一个名为Game的集合中复制数据
{
Id : 123,
Scores : [{ User : "Test" , Score : 5678} , { User : "Hello" , Score : 3456 }],Top Scorer : [{}]
}