0

我编写了一个 FB 应用程序,并希望添加更多功能并使其更具社交性。我正在尝试做的一件事是根据用户朋友查询表存储,并发现用户朋友是否在我的应用程序中“观看”了视频。我可以很好地从 FB 获取朋友 ID,但我不确定如何构造我的表存储查询,因为 FB 用户可以拥有的最大朋友数是 5000,所以我最终可能会得到这样的查询:

var ts1 = azure.createTableService(config.storageAccount, config.storageAccessKey, config.tableHost);
var query = azure.TableQuery
    .select()
    .from('hits')
    .where('PartitionKey eq ?', '0')

for (f in friends){
    query.or('UserID eq ?', friends[f].UserID);
}

ts1.queryEntities(query, function (err, result){
    etc ...
}

导致一个大胖查询!

我的问题是,在对 Windows Azure 表存储进行这种性质的查询时,这是否是最有效和最具成本效益的(最少的表存储事务),还是更好的方法?

4

1 回答 1

0

请记住,表存储不是关系数据库,这意味着您无法利用存储过程的强大功能,以及 SUM 等内置函数……这意味着您无法进行服务器端计算,例如计算总数点击单个用户并返回该结果。

取而代之的是表存储,您需要提取所有这些数据并在消费者端进行工作。另一种解决方案是复制数据。可以为每个点击记录视频、时间等信息……但另一方面,您需要一个包含每个用户的总点击数的不同表格(如共享计数器)。

这样,当您想要单个用户的总点击次数时,您只需查询该值,而无需一遍又一遍地重新计算它。您将写入 2 条记录而不是 1 条,但读取速度会快得多。

Steve Marx 就此写了一篇很好的介绍性文章:Architecting Scalable Counters with Windows Azure

于 2012-10-30T06:54:00.797 回答