2010-06-19 34 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