我有一個實體,除了一些常見屬性外,還包含一個擴展屬性列表,存儲在集合中的(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表的設計不是這樣使用的?如果是這樣,我一定需要改變我的方法。我也接受有關替代方法的建議。
要添加到此,您不應該期望在生產存儲系統中看到XML返回實體上不存在的屬性。我認爲你正在做的是處理你的情況的正確方法。 – smarx 2010-06-19 18:13:32
謝謝!我想這可能是這種情況,但找不到明確指出任何方式的任何文檔。 – 2010-06-19 18:49:14