2011-05-10 43 views
0

使用Windows Azure Table Storage(WATS)並嘗試更新應用以使用Azure。我讀過很多文章,並且不確定最好的方法,那就是自我參照模型中的孩子的父母。Azure表存儲 - 親子模式(自引用架構)

即單個父消息可能有許多子子消息。在數據庫模型中,它將是一個自引用表。

我怎麼會最佳結構本作WATS,這樣當我做一個查詢「給我10個父記錄」,它也將返回所有歸屬於母公司孩子的消息...

的實體消息/子消息如下。我試圖定義PK和RK如下:

public class TextCacheEntity : AzureTableEntity // custom table inherits AzureTableEntity 
{ 
    public override void GenerateKeys() 
    { 
     PartitionKey = string.Format("{0}_{1}_{2}", MessageType, AccountId.PadThis(), ParentMessageId); 
     RowKey = string.Format("{0}_{1}", DateOfMessage.Ticks.ReverseTicks(), MessageId); 
    } 
    public string MessageType { get; set; } 
    public int AccountId { get; set; } 
    public DateTime DateOfMessage { get; set; } 
    public string MessageId { get; set; } 
    public string ParentMessageId { get; set; } 
    // other properties... 
} 

我想實現的,因此孩子的消息存儲parentMessagesId,和父parentMessageId將是空的。

模式將被

  1. 獲取父的消息

    .Where(o => o.ParititionKey == "Parent_000000000000001_").Take(10) 
    
  2. 得到孩子的消息。通過所有的父級的消息迭代,並使用並行for循環

    .Where(o => o.ParititionKey == "Child_000000000000001_" + parentMessageId) 
    

但問題是,這將導致查詢11次!

回答

1

您可以通過對兩者使用相同的PK來做到這一點。有幾個原因可以做到這一點,但最好的一點是,您可以同時爲父代和子代發出批處理命令,並實現一種一致的事務。而且,當它們在同一個表中共享相同的PK時,這意味着它們將一起置於同一個分區中並進行服務。你不太可能延續令牌(但你仍然應該期待它們)。爲了區分父代和子代,你可以添加一個屬性或者使用RowKey。

唯一的技巧就是如果父類和子類不是相同的CLR類型,那麼WCF DataServices中的序列化會遇到問題。當然,您可以通過創建具有子屬性和父屬性的uber-CLR類型來解決此問題,也可以使用ReadingEntity事件重寫序列化並自行處理它。

無論如何,對孩子和家長都使用相同的PK。然後,當您搜索PK範圍時,您將始終獲得父母和孩子的同時返回(如果您願意,可以使用Where子句謂詞進行區分)。

+0

感謝,當時的想法是有,但它會重新發明輪子的很多。 Euginio的答案具體實現解決方案的代碼! – 2011-05-11 03:07:22

+0

我剛寫的一切正是歐金尼奧指出的。我想你不關心事情是如何完成的,而只是想要剪切和粘貼。另外,我想知道是誰幫助編寫了一些特定的工作?檢查貢獻者。 – dunnry 2011-05-11 12:59:46

+0

絕對關心它如何完成並看到實際的代碼,而是試圖自己重新創建它,節省了很多麻煩,並且只是使用我需要的位。是不是軟件開發的目的...找不到貢獻者,但如果你這樣做,可能剛剛發佈鏈接 – 2011-05-11 13:42:03