MongoDB:建模喜欢,共同的朋友等

时间:2011-10-16 21:52:53

标签: ruby-on-rails database-design mongodb mongoid

我正在构建一个具有以下功能的流媒体音乐服务:

  • 关注用户
  • 喜欢歌曲
  • 创建和管理播放列表
  • ...等

我正在使用Rails 3.1,Mongoid和MongoDB。我不确定如何为用户,播放列表和歌曲模型建模。

播放列表与歌曲之间存在多种关系。 Mongoid将每首歌曲的ObjectId存储在每个播放列表的数组中。但我需要为每首歌添加一些元数据< - >播放列表关系,就像特定播放列表中歌曲的位置一样。

我也不确定如何做一些事情,比如找出用户与另一个用户共同的朋友和共同点。在用户文档中存储用户喜欢和朋友真的是个好主意吗?一个用户可能有几千个喜欢和超过一千个朋友等。

这种东西更适合关系数据库吗?

2 个答案:

答案 0 :(得分:1)

我知道这个问题已经过时了,但值得在这里得到其他人可以阅读的答案。

Mongo是为喜欢的概念而构建的。文档存储很容易添加这样的功能,而不必丢弃您的模型,数据或进行任何迁移。

NoSQL dbs(和mongo不是最快的)快速闪电,因此您可以利用这一点并使您的模型变得简单。

我会创建名为Songs,Users,Likes&amp; Sons的文档。播放列表,然后在它们之间创建关联。您可以更改逻辑以适合您的情况,但如果您假设某个播放列表在用户之间共享但由一个用户拥有,您将创建以下关联(取决于mongo驱动程序,语法将有所不同,下面是mongomapper):< / p>

 Playlists: 

 many :users, :as => :shared_with_users
 one :users, :as => :owner

 Users:

 many Playlists

这将创建对象之间的关联。在您的User对象下,您将能够使用user.playlist找到该用户关联的播放列表,user.playlist将返回相关联的播放列表对象的光标。就像使用播放列表对象一样,您可以查看所有者或shared_with_users以找到您想要的对象。

答案 1 :(得分:0)

首先,您应该问自己的问题是:为什么我要将mongoDB用于此应用程序?

您的需求似乎非常适合关系数据库世界(=对象之间的复杂关系)。所以也许你会对关系数据库感到满意。

您的问题有很多选择(当然每个选项都需要权衡):

  • 您可以将M2M关系存储在单独的集合中并执行一些操作 客户端联合
  • 您可以将歌曲嵌入播放列表或播放列表中 歌曲
  • 您可以存储一些播放列表(最常用的播放列表) 实例)进入歌曲和客户端连接另一个集合 对于最少使用的播放列表
  • 您还可以存储一些信息 关于歌曲中的播放列表和其他独立的播放列表 采集。
  • ...

您的选择非常无限,您必须精确地满足您的需求才能做出正确的选择。

如果您只是构建应用程序,那么从非常简单的开始(即使需要更多请求,客户端关节也很容易),然后根据您的瓶颈开始改进模型。