我们即将在内部实施 CQRS 系统的读取部分,目标是大幅提高我们的读取性能。目前,我们的读取是通过一个 Web 服务进行的,该服务对规范化数据运行 Linq-to-SQL 查询,涉及从 SQL Azure 数据库进行一定程度的反序列化。
我们数据的简化结构是:
- 用户
- 对话(将消息分组到相同的收件人)
- 信息
- 收件人(一组用户)
我想将其移至非规范化状态,以便当用户请求查看它从以下任一读取的消息提要时:
Azure 表存储中保存的非规范化表示
- UserID 作为 PartitionKey
- 作为 RowKey 的 ConversationID
- 任何易于更改的易失性数据都存储为实体
- 在实体中序列化为 JSON 的消息
- 所述消息的接收者在实体中序列化为 JSON
- 表存储中一行的大小有限(960KB)的主要问题
- 此外,对“易失性数据”列的任何查询都会很慢,因为它们不是键的一部分
Azure 表存储中保存的规范化表示
- 对话详细信息、消息和收件人的不同表
- 存储在对话表中的消息和收件人的分区键。
- 禁止那个;这遵循与上面相同的结构
- 解决最大行大小问题
- 但是规范化状态会降低非规范化表的性能增益吗?
或者
SQL Azure 中保存的非规范化表示
- UserID 和 ConversationID 作为复合主键保存
- 任何易于更改的易失性数据都存储在单独的列中
- 在列中序列化为 JSON 的消息
- 所述消息的接收者在列中序列化为 JSON
- 索引和非规范化数据结构的最大灵活性
- 性能比表存储查询慢得多
我要问的是,是否有人有在表存储或 SQL Azure 中实现非规范化结构的经验,你会选择哪一个?还是我错过了更好的方法?
我的直觉是,表存储中的规范化(至少在某种程度上)数据将是可行的方法;但是我担心执行 3 次查询以获取用户的所有数据会降低性能提升。