2011-06-13 209 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美元。