使用Azure存储表构建类似博客发布系统的内容。 用户发布消息,数据库记录用户的Region,City和Language。
之后,用户可以浏览所有其他用户的帖子,并能够通过Region,City和Language的任意组合过滤它们。或两者都看不到所有这些。
我看到了几个解决方案:
我看到它的方式:
“成本/便宜”是指基于交易(不是空间)的定价。 而“平衡”我的意思就是这些变种。
考虑使用索引表,但无法看到它们如何在这里提供帮助。 所以问题是,或许还有另一种更好的方法吗?
答案 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)
这取决于您的场景和读/写模式。您可能想要考虑一些方面:
设计如何查询记录。将它们放入"地区 - 城市语言"具有消息ID的分区作为实体数据可能有助于您的快速查询。
每条消息可能具有唯一的消息ID,ID-Message映射保存在其他表中,然后每次只更新消息时更新一个表并且其他表中引用的消息ID保持不变
利用两个键在表设计和查询实体中利用ParitionKey和RowKey。例如:" Region-City-Language"作为分区键和"用户"作为行键。
考虑为查询方案存储实体的重复副本。例如,如果您有大量基于用户和基于语言的查询,您可以考虑使用" user"和#34;语言"分别作为键。
请参阅https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/以获取完整指南。