2010-06-19 31 views
3

我有一個實體,除了一些常見屬性外,還包含一個擴展屬性列表,存儲在集合中的(Name,Value)字符串對。我應該提到,這些擴展屬性在實例和實例之間差別很大,並且只需要爲每個實例列出它們(不會有任何對擴展屬性的查詢,例如查找具有特定(名稱,價值)對)。我正在探索如何使用Windows Azure Table Services堅持這個實體。使用我現在測試的特定方法,我擔心隨着時間的推移,性能可能會下降,因爲應用程序會遇到更多不同的擴展屬性名稱。Windows Azure表服務 - 擴展屬性和表模式

如果我將這個實體存儲在一個典型的關係數據庫中,我可能有兩個表來支持這個模式:第一個將包含實體標識符及其公共屬性,第二個將引用實體標識符並使​​用EAV樣式行建模來存儲擴展(Name,Value)對,每行一個。

由於Windows Azure中的表已經使用了EAV模型,因此我正在考慮對我的實體進行自定義序列化,以便將擴展屬性存儲爲與在實體的編譯時聲明一樣。我可以使用DataServiceContext提供的閱讀和寫作實體事件來完成此操作。

private void OnReadingEntity(object sender, ReadingWritingEntityEventArgs e) 
{ 
    MyEntity Entry = e.Entity as MyEntity; 

    if (Entry != null) 
    { 
     XElement Properties = e.Data 
      .Element(Atom + "content") 
      .Element(Meta + "properties"); 

     //select metadata from the extended properties 
     Entry.ExtendedProperties = (from p in Properties.Elements() 
          where p.Name.Namespace == Data && !IsReservedPropertyName(p.Name.LocalName) && !string.IsNullOrEmpty(p.Value) 
          select new Property(p.Name.LocalName, p.Value)).ToArray(); 
    } 
} 

private void OnWritingEntity(object sender, ReadingWritingEntityEventArgs e) 
{ 
    MyEntity Entry = e.Entity as MyEntity; 

    if (Entry != null) 
    { 
     XElement Properties = e.Data 
      .Element(Atom + "content") 
      .Element(Meta + "properties"); 

     //add extended properties from the metadata 
     foreach (Property p in (from p in Entry.ExtendedProperties 
           where !IsReservedPropertyName(p.Name) && !string.IsNullOrEmpty(p.Value) 
           select p)) 
     { 
      Properties.Add(new XElement(Data + p.Name, p.Value)); 
     } 
    } 
} 

這工作,因爲我可以定義擴展屬性的名稱和值的要求,我可以確保它們符合了Windows Azure的表內實體屬性的所有標準要求。

那麼隨着應用程序遇到數以千計的不同擴展屬性名稱會發生​​什麼?

下面是我的發展存儲環境中觀察到的:

  • 表容器架構的增長,每個新的名稱。我不確定這個模式究竟是如何使用的(可能在下一點),但顯然這個XML文檔隨着時間的推移會變得相當大。

  • 無論何時讀取實例,傳遞給OnReadingEntity的xml都包含爲任何其他實例(不僅僅是爲正在讀取的特定實例存儲的實例)存儲的每個屬性名稱的元素。這意味着一個實體的檢索會隨着時間的推移變得更慢。

我應該期待在生產存儲環境中,這些行爲?我可以看到這些行爲對於大多數表格來說是可以接受的,因爲模式將隨着時間的推移大部分是靜態的。也許Windows Azure表的設計不是這樣使用的?如果是這樣,我一定需要改變我的方法。我也接受有關替代方法的建議。

回答

4

開發存儲使用SQL Express模擬雲表存儲。忽略你在那裏看到的東西......生產存儲系統不存儲任何模式,所以在表中有許多獨特的屬性沒有任何開銷。

+0

要添加到此,您不應該期望在生產存儲系統中看到XML返回實體上不存在的屬性。我認爲你正在做的是處理你的情況的正確方法。 – smarx 2010-06-19 18:13:32

+0

謝謝!我想這可能是這種情況,但找不到明確指出任何方式的任何文檔。 – 2010-06-19 18:49:14