在Azure表中对聊天消息进行非规范化

时间:2012-04-08 13:49:47

标签: azure chat messages azure-table-storage denormalization

我正在使用Windows Azure为移动社交网络构建服务器后端。

我有这3个实体:

  1. 用户 - 存储在SQL Azure中
  2. 线程( 2个用户之间的关系,然后能够相互发送消息) - 存储在SQL Azure中
  3. 消息 - 存储在Azure表中
  4. 当我将消息存储在由Thread ID分区的Azure表中时,我期望在聊天(向/从线程发送/读取消息)时获得良好的性能。

    但我还需要能够为用户提供最新的Threads列表(recent =包含最新的消息)。换句话说,我需要在显示时按最后一个消息日期订购线程。

    扫描许多不同的表分区并查找消息显然会成为性能杀手,因此我需要以某种方式将数据异常化到其他表分区,以便能够有效地获取最新的线程。

    根据您的经验,最佳策略是什么?

2 个答案:

答案 0 :(得分:0)

选择批处理解决方案始终是一种解决方法,让我想起大型机等旧计算。没有什么可以替代在线/实时系统。

如果您选择批量解决方案,它将使您的系统在发布时过时,并将阻止未来的任何技术创新。

当您的Azure数据库开始变得太大而无法查询时,Microsoft建议使用联合。基本上,它意味着将数据分散到多个数据库中,并在代码中使用兼容的访问逻辑。

首先看一下这个演示应用:SQL Azure Federations Tutorial -- Entity Framework

答案 1 :(得分:0)

编辑:经过进一步思考,这是一个更好的建议(我认为):

有一个Message ATS表。该表将包含两种类型的消息:消息发送和消息接收。 每次用户发送消息时,将其作为“已发送”存储在表中,然后作为“已接收”(或者您想要调用这些类型的任何内容)存储。

通过以下方式对Message表中的所有消息进行分区:

(UserId) - PartitionKey,(long.Max - Timestamp.Ticks) - RowKey

作为额外的属性,您可以存储ThreadId,发送/接收区分等

如果你想保证你的消息被插入两次没有问题,请使用Queue和Worker角色。

此方案由用户对所有内容进行分区。您可以在一个时间范围内显示该用户的所有消息,并始终以降序显示。