Мы собираемся внедрить часть Read нашей системы CQRS, цель которой состоит в том, чтобы значительно улучшить производительность чтения. В настоящее время наши чтения проводятся через веб-службу, которая запускает запрос Linq-to-SQL по отношению к нормализованным данным, включая некоторую степень десериализации из базы данных SQL Azure.
Упрощенная структура наших данных:
- Пользователь
- Разговор (группировка сообщений для тех же получателей)
- Сообщение
- Получатели (набор пользователей)
Я хочу переместить это в денормализованное состояние, так что, когда пользователь запрашивает фид сообщений, он читает от EITHER:
Денормализованное представление, хранящееся в хранилище таблиц Azure
- UserID как PartitionKey
- ConversationID как RowKey
- Любые изменчивые данные, подверженные изменениям, хранятся как сущности
- Сообщения, сериализованные как JSON в сущности
- Получатели сообщений, сериализованные как JSON в сущности
- Основная проблема заключается в том, что ограниченный размер строки в хранилище таблиц (960 КБ)
- Также любые запросы в столбцах "volatile data" будут медленными, поскольку они не являются частью ключа
Нормализованное представление, хранящееся в хранилище таблиц Azure
- Разная таблица для деталей беседы, сообщений и получателей.
- Клавиши разделов для сообщений и получателей, хранящихся в таблице бесед.
- Бар, который; это следует той же структуре, что и выше.
- Получает максимальную проблему с размером строки
- Но нормализованное состояние уменьшит прирост производительности денормализованной таблицы?
ИЛИ
Денормализованное представление, содержащееся в SQL Azure
- UserID и ConversationID, хранящиеся как составной первичный ключ
- Любые изменчивые данные, подверженные изменениям, хранятся в отдельных столбцах
- Сообщения, сериализованные как JSON в столбце
- Получатели сообщений, сериализованные как JSON в столбце
- Наибольшая гибкость для индексирования и структура денормализованных данных
- Значительно медленнее, чем запросы хранилища таблиц.
Я спрашиваю, есть ли у кого-нибудь опыт реализации денормализованной структуры в хранилище таблиц или SQL Azure, который вы бы выбрали? Или есть лучший подход, который я пропустил?
Моя кишка говорит, что нормализованные (по крайней мере, до некоторой степени) данные в хранилище таблиц - это путь; однако я опасаюсь, что это уменьшит прирост производительности, чтобы провести 3 запроса, чтобы захватить все данные для пользователя.