使用Windows Azure Table Storage
(WATS)并尝试更新应用以使用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将是空的。
该模式将是
获取父消息
.Where(o => o.ParititionKey == "Parent_000000000000001_").Take(10)
获取子邮件。迭代所有父消息并使用并行for循环
.Where(o => o.ParititionKey == "Child_000000000000001_" + parentMessageId)
但问题是这将导致11个查询!
答案 0 :(得分:1)
你可以通过对两者使用相同的PK来做到这一点。这样做有几个原因,但一个好的原因是您可以同时为父级和子级发出批处理命令,并实现一种一致的事务。此外,当它们在同一个表中共享相同的PK时,这意味着它们将被放在一起并从同一个分区提供服务。你不太可能继续使用令牌(但你仍然应该期待它们)。要区分父项和子项,您可以添加属性或使用RowKey。
对此(以及您已经模型)的唯一技巧是,如果父级和子级不是相同的CLR类型,则在WCF DataServices中存在序列化问题。您可以通过创建具有子属性和父属性的uber-CLR类型来修复此问题,也可以使用ReadingEntity事件覆盖序列化并自行处理。
无论如何,对孩子和父母使用相同的PK。然后,当您搜索PK范围时,您将始终立即返回父项和子项(如果您愿意,可以区别于Where子句谓词)。
答案 1 :(得分:1)
请参阅Scott Densmore的这个例子:
http://scottdensmore.typepad.com/blog/2011/04/multi-entity-schema-tables-in-windows-azure.html