Azure存储表记录过滤建议

时间:2016-10-24 14:06:34

标签: azure azure-storage azure-table-storage

使用Azure存储表构建类似博客发布系统的内容。 用户发布消息,数据库记录用户的Region,City和Language。

之后,用户可以浏览所有其他用户的帖子,并能够通过Region,City和Language的任意组合过滤它们。或两者都看不到所有这些。

我看到了几个解决方案:

  1. 将每条消息放在8个不同的分区中,并使用Region-City-Language(专业人士:阅读时闪电快点查询;缺点:写入时每封邮件8封)。
  2. 将每条消息放在4个不同的分区中,使用Region-City和分区扫描的组合来按语言过滤(专业:比(1)少的事务;缺点:分区扫描,每条消息4个事务)。
  3. 根据用户的ID将每条消息放入分区(专业:每条消息的单个事务;缺点:之后的慢表扫描和分区扫描)。
  4. 我看到它的方式:

    1. 快速读取,慢速(可能代价高昂)写入。
    2. 平衡读/写/费用。
    3. 快速写入,慢速(但便宜)读取。
    4. “成本/便宜”是指基于交易(不是空间)的定价。 而“平衡”我的意思就是这些变种。

      考虑使用索引表,但无法看到它们如何在这里提供帮助。 所以问题是,或许还有另一种更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我决定使用(1)的变体。

不同之处在于我不会存储Region-Location-Language的所有组合。相反,我决定只存储唯一的:

Table: FiltersByRegion
----------------------
Partition:  Region
Row:        Location.Language
Prop:       Message
Table: FiltersByRegionPlace
---------------------------
Partition:  Region.Location
Row:        Language
Prop:       Message
Table: FiltersByRegionLanguage
------------------------------
Partition:  Region.Language
Row:        Location
Prop:       Message
Table: FiltersByLanguage
------------------------
Partition:  Language
Row:        Region.Location
Prop:       Message

由于我只存储唯一身份证明每个帖子不会有很多交易。只有那些尚未存在于数据库中的那些。

换句话说,如果来自同一region-location-language的帖子很多,则不会更新过滤表,也不会花费事务。对uniques的测试可以使用Redis来加快速度。

过滤现在只需选择正确的表格。

答案 1 :(得分:-1)

这取决于您的场景和读/写模式。您可能想要考虑一些方面:

  1. 设计如何查询记录。将它们放入"地区 - 城市语言"具有消息ID的分区作为实体数据可能有助于您的快速查询。

  2. 每条消息可能具有唯一的消息ID,ID-Message映射保存在其他表中,然后每次只更新消息时更新一个表并且其他表中引用的消息ID保持不变

  3. 利用两个键在表设计和查询实体中利用ParitionKey和RowKey。例如:" Region-City-Language"作为分区键和"用户"作为行键。

  4. 考虑为查询方案存储实体的重复副本。例如,如果您有大量基于用户和基于语言的查询,您可以考虑使用" user"和#34;语言"分别作为键。

  5. 请参阅https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/以获取完整指南。