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



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

我有这 3 个实体:

  1. 用户 - 存储在 SQL Azure 中
  2. 线程(2个用户之间的关系,然后能够相互发送消息) - 存储在SQL Azure中
  3. 消息 - 存储在 Azure 表中

当我将消息存储在按线程 ID 分区的 Azure 表中时,我希望在聊天(向线程发送/从线程发送/读取消息)时具有良好的性能。

但我还需要能够为用户提供最新线程的列表(最近的 = 包含最新的消息)。换句话说,我需要在显示时按最后消息日期对线程进行排序。

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

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

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

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

按以下内容对消息表中的所有消息进行分区:

(用户 ID) - 分区键,(长。Max - 时间戳.刻度) - 行键

作为额外的属性,您可以存储 ThreadId、已发送/接收差异等。

如果要保证消息插入两次而没有问题,请使用队列和辅助角色。

此方案按用户对所有内容进行分区。 您将能够显示某个时间范围内进出该用户的所有消息,并且始终是降序的。

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

如果您选择批处理解决方案,它将使您的系统在启动时过时,并将阻止将来的任何技术创新。

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

首先查看此演示应用:SQL Azure 联合身份验证教程 -- 实体框架

最新更新