【问题标题】:MongoDB: Modeling likes, mutual friends etcMongoDB:建模喜欢,共同的朋友等
【发布时间】:2011-12-08 21:51:42
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

Mongo 是为诸如喜欢之类的概念而构建的。文档存储使得添加诸如此类的功能非常容易,而无需放弃您的模型、数据或进行任何迁移。

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

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

 Playlists: 

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

 Users:

 many Playlists

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

【讨论】:

    【解决方案2】:

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

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

    有很多选项可以解决您的问题(当然,每个选项都有取舍):

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

    您的选择是无限的,您必须明确您的需求才能做出正确的选择。

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

    【讨论】:

    • 我很高兴使用 MongoDB。我可以将所有内容都转换为关系数据库,但我的意思是,即使我使用两个查询而不是一个查询进行客户端连接,如果它被正确索引会慢多少?我正在寻找适合我的情况的最佳做法...... :)
    • 它会慢 2 倍,我认为它更多地取决于您的网络延迟速度而不是查询速度(如果正确索引当然)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多