2011-06-13 211 views
16

实施简单在Azure存储中寻呼相对简单:Paging with Windows Azure Table Storage。这可以通过连续令牌功能来实现。Azure存储表寻呼

但是。

这只是认真分页的一个开始。第一个问题是排序。您无法在Azure Table中执行OrderBy。什么是解决这个问题的最佳解决方案?页面必须排序,这就是事实。

第二个问题,当来到分页时,要知道总页数,只有连续令牌功能,这是不可能的。在每个页面上执行“.Count()”在我看来非常低效(例如,因为分区可能在多个服务器上)。

第三个问题是,与第二个问题有关,即使您可以统计您有多少页,如何将计数页连接到实际连续令牌?这对我来说是最大的谜团。 如何从特定的表格行获得延续?

如果能够提供正确的解决方案,我会非常高兴。我必须承认我也有一个,我会写在下面的答案之一。

+0

对此问题的回答? – 2011-07-06 12:57:59

+2

如果您需要排序和计数表存储不是正确的产品。 SQL Azure提供排序和计数。表存储用于存储大量的行,并在分区键和行键上进行主要搜索。它用于序列化大量的类。 – Paparazzi 2012-01-13 19:36:33

+0

这听起来像你需要一个关系数据库,而不是NoSQL。 – tugberk 2012-02-02 18:05:18

回答

10

我知道这并不能解决你所问的问题,但我仍然不相信分页应该按照你的建议进行。我的意思是,由于Azure表存储不支持所需的功能,因此它可能不太合适。

我会得到本地缓存中的数据,在那里执行命令和分页,并用它来完成。有一个建议解决这个限制与仔细构建rowkey/partitionkey,但我强烈建议你不要这样做。

Blog blog= new Blog(); 
// Note the fixed length of 19 being used since the max tick value is 19 digits long. 
string rowKeyToUse = string.Format("{0:D19}", 
     DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks); 
blog.RowKey = rowKeyToUse; 

因此,一个博客B1日10/1/2008上午10时00分00秒将有2521794455999999999为RowKey和B2过时的2008年10月2日上午10时00分00秒将有2521793591999999999为RowKey因此b2将在b1之前。

要检索后10/1/2008为10:00:00 am日所有博客,我们将使用follwing查询:

 string rowKeyToUse = string.Format("{0:D19}", 
     DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks); 
var blogs = 
    from blog in context.CreateQuery<Blog>("Blogs") 
    where blog.PartitionKey == "Football" 
     && blog.RowKey.CompareTo(rowKeyToUse) > 0 
    select blog; 

(这是由Windows Azure的表,2008年12月拍摄的文件provided由微软)

至于计数的页数,这很容易,简单的分割操作将在这里做的伎俩,至于延续标记,一种方法是(在初始请求时)在每个页面上“散步”并获得延续标记,它基本上只是告诉你下一个分区键是哪一行。但拥有它们意味着你很容易出现一致性错误(例如,如果有人将某些内容发布到同一个表存储中)。

就我个人而言,我会基于rowkeys,如上所述,或者,如果这是一个要求,移动到支持它的存储引擎。

若要进一步阐述,如果您知道只有一个“OrderBy”子句,则可以选择所有子句,并通过一些含义猜测页面边界是什么。

在附注中,我认为提供的分页是不允许在前端进行分页的,但是可以分配1000个结果限制。但这只是我的0.02美元。