【问题标题】:Designing MongoDB collections vs relational approach设计 MongoDB 集合与关系方法
【发布时间】:2016-02-05 12:57:01
【问题描述】:

我在设计我的 MongoDB 集合以满足我的要求时遇到了困难。我在以前的项目中只使用过 SQL 数据库,对 MongoDB 的 NoSQL 概念还很陌生。我目前获得这个概念的学习项目是存储和检索所玩游戏的统计数据(增强的排行榜示例)。在关系数据库中,我将创建以下表:

Matches
:_id
:game_id    (reference to the type of game played)
:startedAt
:endedAt

Results
:match_id
:player_id  (reference to the users collection)
:field_id
:value

一场比赛可以有 n 个玩家,每个玩家可以有 n 个结果。根据游戏类型,需要为每个玩家输入由 field_id 指示的多个结果值(例如,点数和用户是否获胜 -> 两个字段 = 结果表中的两行)。 据我了解,在 MongoDB 中,概念是将相关信息存储在一个集合中,我试图忽略过去一年对关系数据库所做的事情,并创建了以下集合结构:

Matches
:_id
:game_id
:startedAt
:endedAt
:players [{
    :player_id
    :results [{
        :field_id
        :value
    }]
}]

但是,我现在很难计算特定玩家的总体结果。 “计算玩家 A 在游戏 B 中的总点数”这样的查询非常复杂,我担心性能会很差。因此,对于这种情况,我仍然更喜欢关系模型。但是当我想学习 NoSQL 数据库的概念时,我仍然想知道,我是否只是误解了数据库,并且有一种很好的方法可以将数据构造在单个集合中以进行查询。

非常感谢任何建议。

【问题讨论】:

    标签: mongodb meteor nosql


    【解决方案1】:

    我是 MongoDB 新手,最近才开始学习,但目前我知道的如下:

    NOSQL 数据库,例如 MongoDB,主要用于它们的可扩展性和灵活性。对于简单的小型项目,我看不到任何好处。

    您描述的案例是一个应该使用SQL的经典案例。

    如果我被选中创建该数据库并且我必须使用 MongoDB,我会这样做: 1) 保留您为比赛创建的收藏和 2) 根据玩家添加新的收藏。

    第二个集合将用于排行榜和基于玩家的所有内容。这意味着会有重复的数据,但没有其他方法可以处理玩家搜索,而您需要为排行榜做这些。

    如果只保存最新的比赛,也许它可以工作,但我仍然没有看到任何好处。

    正如我之前提到的,我也在学习过程中,所以我不是 100% 确定。

    祝你的项目好运。

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      相关资源
      最近更新 更多