Mongodb设计模式 - 内存与磁盘空间之间的权衡

时间:2015-12-04 22:43:04

标签: mongodb mongodb-.net-driver relationships database nosql

我是mongodb的新手,并且一直在研究NoSQL设计模式,但在一个场景中有点困惑。我可以通过多种方式在SQL中实现这个概念,但我不确定如何使用NoSQL实现这一点。

探索NoSQL解决方案的原因是:
1)简单地说,为了学习新的东西

情境: 假设我们有一个电影标题列表和一个用户列表。每个用户都会收到一些新电影。一旦电影呈现给用户,用户必须喜欢或不喜欢电影。一旦他们投票(喜欢或不喜欢),电影将永远不会再次呈现给该用户,从而策划他们的新电影列表。

所以只是回顾一下 1)新电影列表将始终显示以前从未向该用户显示的电影。
2)我们需要查询用户喜欢的电影列表。

在SQLServer中,这非常简单直接,我们有三个表(用户,电影,投票)与每个ID建立关系

User{
     int UserId, 
     varchar UserName
    }
Movie{
     int MovieId,
     varchar MovieTitle,
     varchar MovieDescription
}
Vote{
     int VoteId,
     int UserId,
     int MovieId,
     bit DidUserLikeMovie
}
  • 每次用户投票时,我们都可以将投票添加到投票表中
  • 每次我们需要用户喜欢的电影列表时,我们都可以轻松加入表格并收到列表
  • 每当我们需要新电影列表时,我们只能验证userId在所投票表上没有所请求的movieId的条目

问题: 现在我的问题是,在NoSQL环境中,什么是正确的设计方法?

我的想法:
1)我们可以用三个表(用户,电影和投票)以相同的方式设计设置,但是每次用户请求新的movieList时都需要大量的读取,因为NoSQL没有没有联合或关系。
2)我们可以使用两个文档(用户,电影)设计设置,并将电影文档中的投票存储为:

Movies{
         int MovieId,
         varchar MovieTitle,
         varchar MovieDescription
         List<Votes> Votes {
                      User UserInfo {...},
                      bool DidUserLikeMovie,
                }
    }

当我们想要获得用户已经“喜欢”的电影列表时,这可能有点贵 3)我们可以将电影投票存储在用户文档中

User{
         int UserId, 
         varchar UserName
         List<Votes> Votes {
                      Movie MovieInfo { ... },
                      bool DidUserLikeMovie,
                }
    }

但是生成我们的新电影列表可能有点贵 4)我们可以使用所描述方法的混合,并将投票存储在电影文档和用户文档中。这将导致快速读取,但是这需要写入电影文档和用户文档,并且需要数据库增长两倍。

非常感谢任何建议,文章或其他选项!

0 个答案:

没有答案