Ruby on rails MongoDB:喜欢模特,共同的朋友等

Ruby on rails MongoDB:喜欢模特,共同的朋友等,ruby-on-rails,database-design,mongodb,mongoid,Ruby On Rails,Database Design,Mongodb,Mongoid,我正在构建一个流媒体音乐服务,该服务将具有以下功能: 跟踪用户 喜欢唱歌 创建和管理播放列表 ……等等 我使用的是Rails 3.1、Mongoid和MongoDB。我不确定应该如何为我的用户、播放列表和歌曲模型建模 播放列表和歌曲之间存在多对多关系。Mongoid将每首歌曲的ObjectId存储在每个播放列表的数组中。但是我需要为每个歌曲播放列表关系添加一些元数据,比如歌曲在特定播放列表中的位置 我也不确定如何找出一个用户与另一个用户的共同朋友和共同喜好。在用户文档中存储用户喜欢的内容和朋

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

  • 跟踪用户
  • 喜欢唱歌
  • 创建和管理播放列表
  • ……等等
我使用的是Rails 3.1、Mongoid和MongoDB。我不确定应该如何为我的用户、播放列表和歌曲模型建模

播放列表和歌曲之间存在多对多关系。Mongoid将每首歌曲的ObjectId存储在每个播放列表的数组中。但是我需要为每个歌曲播放列表关系添加一些元数据,比如歌曲在特定播放列表中的位置

我也不确定如何找出一个用户与另一个用户的共同朋友和共同喜好。在用户文档中存储用户喜欢的内容和朋友真的是个好主意吗?一个用户可能有几千个喜欢的人和一千多个朋友等等


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

您首先应该问自己的问题是:为什么我要在这个应用程序中使用mongoDB

您的需求似乎非常适合关系数据库世界(=对象之间的复杂关系)。因此,也许有了关系数据库,你会更开心

你的问题有很多选择(当然每个选择都有权衡):

  • 您可以将M2M关系存储在单独的集合中,并执行一些操作 客户端连接
  • 您可以将歌曲嵌入播放列表,或将播放列表嵌入到 歌曲
  • 您可以存储一些播放列表(最常用于 实例)并与另一个集合进行客户端连接 查找使用最少的播放列表
  • 您还可以存储一些信息 关于您歌曲中的播放列表以及独立音乐中的其他内容 收藏
你的选择是无限的,你必须精确你的需求才能做出一个好的选择


如果您只是在构建应用程序,请从一些非常简单的事情开始(即使需要更多请求,客户端连接也可能很容易),然后根据您的瓶颈开始改进您的模型。

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

您的需求似乎非常适合关系数据库世界(=对象之间的复杂关系)。因此,也许有了关系数据库,你会更开心

你的问题有很多选择(当然每个选择都有权衡):

  • 您可以将M2M关系存储在单独的集合中,并执行一些操作 客户端连接
  • 您可以将歌曲嵌入播放列表,或将播放列表嵌入到 歌曲
  • 您可以存储一些播放列表(最常用于 实例)并与另一个集合进行客户端连接 查找使用最少的播放列表
  • 您还可以存储一些信息 关于您歌曲中的播放列表以及独立音乐中的其他内容 收藏
你的选择是无限的,你必须精确你的需求才能做出一个好的选择


如果你只是在构建你的应用程序,那么从一些非常简单的事情开始(也许客户端连接很容易,即使它需要更多的请求),然后根据你的瓶颈开始改进你的模型。

我知道这个问题很老,但这里有其他人可以阅读的答案是值得的

Mongo是为类似的概念而构建的。DocumentStore使添加此类功能变得非常容易,而无需放弃模型、数据或进行任何迁移

NoSQL dbs(mongo不是最快的)闪电般快速,因此您可以利用这一点,简化模型

我会创建名为歌曲、用户、喜好和播放列表的文档,然后在它们之间创建关联。您可以根据自己的情况更改逻辑,但如果假设播放列表在用户之间共享,但由一个用户拥有,则会创建以下关联(取决于mongo驱动程序,语法会有所不同,下面是mongomapper):


这将在对象之间创建关联。在用户对象下,您可以使用User.playlist查找该用户关联的播放列表,该用户将返回关联的播放列表对象的光标。与使用播放列表对象相同,您可以查看所有者或与用户共享的对象,以找到您想要的对象。

我知道这个问题很老,但值得在这里找到其他人可以阅读的答案

Mongo是为类似的概念而构建的。DocumentStore使添加此类功能变得非常容易,而无需放弃模型、数据或进行任何迁移

NoSQL dbs(mongo不是最快的)闪电般快速,因此您可以利用这一点,简化模型

我会创建名为歌曲、用户、喜好和播放列表的文档,然后在它们之间创建关联。您可以根据自己的情况更改逻辑,但如果假设播放列表在用户之间共享,但由一个用户拥有,则会创建以下关联(取决于mongo驱动程序,语法会有所不同,下面是mongomapper):


这将在对象之间创建关联。在用户对象下,您可以使用User.playlist查找该用户关联的播放列表,该用户将返回关联的播放列表对象的光标。与使用播放列表对象相同,您可以查看所有者或与用户共享的对象,以找到您想要的对象。

使用MongoDB我非常高兴。我可以将所有内容转换为关系数据库,但我的意思是,即使我使用两个查询(而不是一个查询)进行客户端连接,如果索引正确,速度会慢多少?我在寻找适合我的情况的最佳实践…:)它将慢2倍,我认为这将更多地取决于网络的延迟速度,而不是t
 Playlists: 

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

 Users:

 many Playlists