2016-10-24 51 views
-2

使用Azure存储表构建类似博客发布系统的图像。 用户发布消息并且数据库记录用户的区域,城市和语言。Azure存储表记录过滤建议

之后,用户可以浏览所有其他用户的帖子,并且可以通过区域,城市和语言的任意组合来筛选它们。或者两者都看不到。

我看到几个解决方案:

  1. 把每一个消息在8个不同的分区与区域 - 城市 - 语言的组合(优点:在读快如闪电的点查询;缺点:每封邮件的8笔上写)。
  2. 将每条消息放在4个不同的分区中,并使用Region-City和分区扫描功能进行分组扫描,以便通过语言进行筛选(优点:比(1)更少的事务处理;缺点:分区扫描,每条消息4个事务)。
  3. 根据用户ID(优点:每条消息的单个事务;每个消息都使用慢速表扫描和分区扫描)将每条消息放入分区。

的路上我看到它:

  1. 速读,慢(也许是昂贵的)写道。
  2. 平衡读取/写入/成本。
  3. 快写,慢(但便宜)的读取。

“成本/便宜”我的意思是基于交易(而不是空间)的定价。 而“平衡”我的意思是在这些变种之中。

想到使用索引表,但看不到他们在这里如何帮助。 所以问题是,也许还有另一种更好的方法?

+0

这真是意见征集和广泛 - 没有正确的答案。您需要进行基准测试,并为您的特定应用选择正确的组合。不知道你的意思是“索引表”(也许你指的是额外的存储表,特定的索引属性作为分区/行键?)。 –

+0

是的。索引表就像你所描述的。我问是否有任何其他可能的解决方案。 –

回答

0

我决定去(1)的变体。

区别在于我不会存储区域位置语言的所有组合。相反,我决定只存储唯一身份:

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 

因为事实上我是只存储的唯一身份有赢”的每个帖子都会有很多交易。只有那些尚未出现在数据库中的数据库。

换句话说,如果来自同一个区域位置语言的帖子很多,过滤表将不会被更新,并且交易将不会被消耗。独特测试可以使用Redis来加快速度。

过滤现在只是挑选正确的表的问题。

-1

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

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

  2. 每条消息都可能有一个唯一的消息ID和ID-消息映射保存在其他表中,每当更新消息并且其他表中引用的消息ID保持不变时,每次只需要更新一个表。

  3. 在您的表设计中利用ParitionKey和RowKey并使用两个键查询实体。例如:“Region-City-Language”作为分区键,“User”作为行键。

  4. 考虑为查询场景存储实体的重复副本。例如,如果您有大量基于用户和基于语言的查询,则可以考虑分别使用“user”和“language”作为关键字的两个表。

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