如何在不降低应用程序速度的情况下为每个用户录制播放?

时间:2012-01-23 12:55:24

标签: php mongodb schema

我正试图找出一种记录用户播放的方法,而不像iTunes那样放慢我的应用程序。

我的应用程序基本上是一个与Facebook大量集成的音乐网站,Facebook用户可以登录并批准我的应用程序并开始收听歌曲并制作自己的播放列表等。

使用phpmongodb构建应用程序。

我已尝试添加此功能2次,但每种方法都有自己的缺陷,我只是想看看你们“专业人士”的想法,因为我只有1年的构建应用程序的经验。

方法1

制作一个名为plays的收藏家,每个文件都是这样的。

{ "user" => "user mongoid", "track" => "track mongoid" }

方法1的问题

这个问题是它会很慢,因为当我显示艺术家页面时 我将不得不列出最近的20首曲目,然后在获得曲目时,我将不得不检查每首曲目当前用户收听的数量。

所以在获得曲目之后我将不得不让当前用户进行播放:

// getting the tracks.
$cursor = $this->tracks->find();
$tracks = array();

foreach ($cursor as $t) {
  // getting the number of plays.
  $t['plays'] = $this->plays->find(array('user_id' => $user, 'track_id' => $t['_id']))->count();
  $tracks[]   = $t;
}

方法2。

在用户文档中嵌入播放。 这种方法看起来还不错,而且速度非常快,当用户播放曲目时,只需添加或增加此曲目的曲目数。 然后只显示它们。

此方法的问题。 MongoDB只允许4 MB的文档。我不能只是推送用户文档中的所有内容。

我在网上看到一个与mongo遇到类似问题的人,但我没找到任何人。

那么如何在不使应用程序变慢的情况下记录每个用户的播放?

2 个答案:

答案 0 :(得分:0)

我对MongoDB并不熟悉,但将“播放”文档更改为以下内容会更有意义:

{ "user" => "user mongoid", "track" => "track mongoid", "plays" => "number of plays" }

这样,当您显示艺术家概述时,您无需进行计数。我怀疑MongoDB可以进行非常快速的查找/更新,但基于其他问题(如MongoDB's performance on aggregation queries)聚合似乎相当慢。

答案 1 :(得分:0)

我建议将曲目历史记录移到另一个集合中。你是正确的,集合中的永远文件是不理想的(尽管最大文档大小现在是16MB)。

你需要保留所有事物的历史记录还是仅仅保留最后20个历史记录?如果它只是最后20个,那么也许你可以将其嵌入。

我还建议通过以与John概述的方式类似的方式($ inc)来计算应用中的播放次数(上面的答案)。然后你不必用count()进行计算,这可能很慢。

{'user':'<user>', 'track':'<track>','plays':1}

然后使用类似的内容进行更新

db.col.update({'user':'aUser'},{$inc : {'plays' : 1}});