Azure表存储 - 父子模式(自引用模式)

时间:2011-05-10 07:33:34

标签: azure data-modeling azure-table-storage

使用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将是空的。

该模式将是

  1. 获取父消息

    .Where(o => o.ParititionKey == "Parent_000000000000001_").Take(10)
    
  2. 获取子邮件。迭代所有父消息并使用并行for循环

    .Where(o => o.ParititionKey == "Child_000000000000001_" + parentMessageId)
    
  3. 但问题是这将导致11个查询!

2 个答案:

答案 0 :(得分:1)

你可以通过对两者使用相同的PK来做到这一点。这样做有几个原因,但一个好的原因是您可以同时为父级和子级发出批处理命令,并实现一种一致的事务。此外,当它们在同一个表中共享相同的PK时,这意味着它们将被放在一起并从同一个分区提供服务。你不太可能继续使用令牌(但你仍然应该期待它们)。要区分父项和子项,您可以添加属性或使用RowKey。

对此(以及您已经模型)的唯一技巧是,如果父级和子级不是相同的CLR类型,则在WCF DataServices中存在序列化问题。您可以通过创建具有子属性和父属性的uber-CLR类型来修复此问题,也可以使用ReadingEntity事件覆盖序列化并自行处理。

无论如何,对孩子和父母使用相同的PK。然后,当您搜索PK范围时,您将始终立即返回父项和子项(如果您愿意,可以区别于Where子句谓词)。

答案 1 :(得分:1)