我已经写了一个FB应用程序,并想添加一些更多的功能,使其更具社会性。我正在尝试做的一件事是根据用户的朋友查询表存储,并发现用户的朋友是否在我的应用程序中“观看”了视频。我可以很好地从FB获取好友is,但我不确定如何构造对表存储的查询,因为一个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 ...
}导致了一个大的fat查询!
我的问题是,当对Windows Azure表存储执行这种性质的查询时,这是最有效和最具成本效益的(最小表存储事务)还是更好的方法?
发布于 2012-10-30 14:54:01
请注意,表存储不是关系数据库,这意味着您不能利用存储过程的强大功能,内置函数如SUM等。这意味着你不能进行服务器端的计算,比如计算单个用户的总点击量并返回结果。
取而代之的是,使用表存储,您将需要引入所有这些数据,并在消费者端完成工作。另一种解决方案是复制您的数据。这是很好的记录,每一次点击与信息,如视频,时间,...但另一方面,您将需要一个不同的表,其中包含每个用户的总点击量(就像一个共享计数器)。
这样,当您想要单个用户的总点击量时,您只需查询该值,而不必一遍又一遍地重新计算它。您将写入2条记录而不是1条,但读取速度会快得多。
Steve Marx为此写了一篇很好的介绍性文章:Architecting Scalable Counters with Windows Azure
https://stackoverflow.com/questions/13131671
复制相似问题