如何优化构建MongoDB数据库以获取用户的所有属性?

时间:2018-03-31 15:59:43

标签: node.js mongodb mongoose

我正在构建一个用户对象有多个游戏对象的应用程序。从mongoDB数据库中获取所有用户游戏的正确策略是什么?

据我所知,我有两个选择:

  1. 为用户提供游戏属性,该属性是用户拥有的一系列游戏,然后逐个获取每个游戏
  2. e.g。 示例用户<​​/ p>

    {
      _id: '1342',
      name: 'Dave',
      games: [
        '12345678',
        'fgnhe45rnd',
      ],
    }
    

    示例游戏

    {
      _id: '12345678',
      name: 'Fluxx',
    }
    
    1. 相反。为每个游戏提供一个用户属性,该属性是拥有该游戏的一组用户ID。然后获取具有特定用户ID的所有游戏。
    2. e.g。 示例用户<​​/ p>

      {
        _id: '1342',
        name: 'Dave',
      }
      

      示例游戏

      {
        _id: '12345678',
        name: 'Fluxx',
        users: [
          '1342',
          '5783',
        ],
      }
      

      任何建议表示赞赏。 谢谢。

2 个答案:

答案 0 :(得分:0)

如果你需要用户的游戏,你应该使用1.例如我需要kevin的游戏:你可以用2来获得kevin的游戏。?

答案 1 :(得分:0)

用例

  1. 用户对象有多个游戏对象
  2. 获取所有用户的游戏
  3.   

    我建议您使用第一个选项

    示例用户<​​/ p>

    {
      _id: '1342',
      name: 'Dave',
      games: [
        '12345678',
        'fgnhe45rnd',
      ],
    }
    

    游戏示例

    {
      _id: '12345678',
      name: 'Fluxx',
    }
    

    原因

    正如您在用例中所提到的,您正在获取所有用户的游戏。

    第一个选项

    因此,如果您要获取Dave的所有游戏,您只需要获得Dave的游戏列表,然后将每个游戏引用到其数据中。这是 1 + n fetch ,其中 n是游戏Dave的数量

    第二个选项

    如果您使用第二个选项,则需要浏览每个游戏以检查游戏中的用户列表是否包含Dave。然后,只有Dave在列表中时才必须记录数据。这是 N fetch ,其中 N是数据库中的游戏总数

    通常,N大于n + 1.