MongoDB:我如何存储以下关系?

时间:2013-09-21 14:19:45

标签: mongodb

我是一名IT学生,我们只是在大学学习RDBMS。我想与MongoDB取得联系并开发一个小型视频游戏收藏管理器,仅用于教育目的。

我想概述一下存储的可用平台。 E.g

  • PC
  • Xbox
  • Xbox 360
  • 游戏机

等等

当选择启用平台时,我想查询与所选平台匹配的所有条目。

所以我的第一个想法就是收藏:平台和游戏

平台:

_id : "PLATFORMID"
name : platform_one

游戏:

_id : "SOMEID"
name : game_One
publisher : somePublisher
platform : PLATFORMID

我知道尽可能多地写入文档是最佳做法,但我认为在这种情况下它并不理想,因为要获得所有可用的平台,我必须查询所有游戏然后迭代整个收集和挑选平台。

通过我的方法,可以在启动时仅加载平台,然后查询所有游戏。

我是对的还是MongoDB有更好的解决方案?

由于这是我使用NoSql DB的第一个项目,所以我们非常感谢任何帮助或提示。

1 个答案:

答案 0 :(得分:0)

在设计模式之前,我建议您阅读:http://docs.mongodb.org/manual/core/data-modeling/,因为它可以为您提供关于mongo中不同数据模型的好主意。这将为如何在Mongo中做事做一个坚实的基础(这与传统的RDB非常不同)。

Mongo架构高度依赖于用例,因此数据结构与程序紧密集成。不要认为有必要完全规范化您的数据,这在使用mongo时通常不是正确的方法。还要注意,一旦这是真的,有许多不同的模式结构可供选择,并且通常所需的性能是如何做出选择。因此,具有完全相同数据的两个应用程序可能具有完全不同的数据结构,并且两者对于它们的用例都是正确的,并且对于它们使用其他数据结构是不正确的(如果您还喜欢性能)。 对于您的具体情况,我建议将平台字段放入游戏文档中。要获得所有平台,有几种方法。 第一个选项:拥有一个包含所有平台的集合。这些可以存储在_id字段中,也可以是唯一的内容,或者您​​可以拥有该平台的其他字段。这些平台将是独一无二的,程序逻辑必须保持更新。在为游戏集创建文档时,应用程序可能仅提供平台作为此集合的选择列表。这将允许许多客户在廉价提供的平台上保持同步。请注意,没有外键,因此程序本身必须保持这些集合同步。 第二个选项:使用distinct:http://docs.mongodb.org/manual/reference/command/distinct/。这将返回查询的不同值。在这个具体案例中:

db.runCommand({distinct:“game”,key:“platform”,query:{}})

然而,在大型集合上获取静态数据集时,这可能过于昂贵。因此,如果密钥相对固定,则最好使用第一个选项。如果密钥可以在查询之间变异,那么这个选项是最好的。

最佳, 查理