CQRS - сторона запроса - PullRequest
32 голосов
/ 16 февраля 2010

Многие статьи в блогосфере, относящиеся к разделению CQRS (ответственность за запросы команд), предполагают, что все экраны / модели представления плоские. например Имя, возраст, место рождения и т. Д. И, следовательно, предположение, что при внедрении мы помещаем их в источник для быстрого чтения и т. Д. ... по одной таблице на просмотр mySQL и т. Д. и т.д ..

Однако, хотя я согласен с тем, что доменные модели плохо отображаются на большинстве экранов, многие из экранов, с которыми я работаю, являются более многомерными, и я уверен, что это довольно распространенное явление. в приложениях LOB.

Так что мой вопрос в том, как люди обрабатывают экран, на котором, например, отображается сводная информация о клиентах, а затем список их заказов со ссылкой [более подробно] и т. Д. ...

Я думал о том, чтобы придерживаться прямого SQL-запроса к базе данных запросов, разрывающего внешнее объединение, чтобы можно было создать подходящую ViewModel для View, но это кажется излишним?

В качестве альтернативы (это начинает казаться неприятным) в таблице CustomerSummaryView есть столбец text / big (независимо от типа в вашей БД), называемый Orders, а столбцы для сетки экрана сводки Order разделяются, а строки - | , Даже с типом данных XML он все еще грязный.

Есть мысли об оптимальной практике?

Ответы [ 5 ]

33 голосов
/ 08 марта 2010

Да, возникает путаница. Вот как это происходит: во-первых, для того, чтобы действительно помочь новым людям понять, что такое CQRS, и действительно показать, чем он отличается от типичной многоуровневой архитектуры, люди говорят что-то вроде: «Ваши модели представлений могут быть абсолютно плоскими», и «В вашей базе данных запросов должна быть одна таблица для каждой модели представления».

Но это на самом деле просто для того, чтобы уяснить ситуацию ... неправда, что у вас должна быть только одна таблица на модель представления (хотя в большинстве случаев вам, вероятно, следует). Эти заявления пытаются сказать так: «Вы должны избавиться от некоторых правил, которых вы так долго придерживались в вопросе нормализации. С архитектурой CQRS у вас есть возможность создавать таблицы базы данных в своем канале запросов которые полностью сформированы в соответствии с потребностями вашего взгляда и ничем иным. Убедитесь, что вы в полной мере используете это. Не идите на полпути, нормализуя эти таблицы только потому, что это то, что вы привыкли делать. Вместо этого, идти вперед и делать вещи, которые раньше считались немыслимыми, такие как создание одной таблицы базы данных на модель представления или создание полностью плоских таблиц модели представления. "

Есть еще такие случаи, как у вас, когда схема, которая лучше всего соответствует вашим потребностям, будет иметь несколько таблиц. Вы можете даже (не дай Бог) сделать соединение или два Это нормально, если вы действительно спроектировали таблицы базы данных для обслуживания вашего представления, а не наоборот. Но будьте осторожны, легко сползти вниз по пути нормализации и обмена данными между многими представлениями в базе данных запросов. Не ходите туда ... просто нет причин, и это приносит больше затрат, чем выгод. Основная цель заключается в следующем: логика вашего представления должна быть мертвой, очень простой. Вы хотите, чтобы интеллектуальные правила жили в командной части дома и немного в подписчиках, которые заполняют данные в канале запросов. Поэтому код, который читает из базы данных запросов и показывает данные на экране, должен быть очень простым (почти таким же простым, как «пассивное представление»).

Обновление: В качестве еще одного подтверждения заявления о том, что некоторые объединения не "запрещены", если вы разработали форму базы данных для наилучшего выполнения задачи, которую вы достигаете, рассмотрите OLAP. Схема типа "звезда" является совершенным примером схемы базы данных, разработанной для поддержки reads , которая идеально вписывается в сторону запроса CQRS, и что делает включает в себя соединения. Объединения остаются простыми и используются для дальнейшего улучшения целей задач чтения, выполняемых для базы данных.

5 голосов
/ 16 февраля 2010

Если кто-то на самом деле говорит, что ваши модели зрения должны быть плоскими, они либо упрощают свой пример, либо говорят чепуху.иерархические данные неплохие, и их не следует избегать в ваших моделях представления.

хотя для этого на самом деле не существует «лучших практик».все это очень субъективно в том, как вы загружаете данные.вам нужно найти решение, которое хорошо работает для вашей текущей команды и системы.и вы также должны понимать, какие есть другие варианты, потому что вы, вероятно, столкнетесь с ситуацией, когда ваше текущее решение неадекватно.

Вот некоторые способы, которыми я справляюсь, в зависимости от приложения, которым яработая в C # / .NET:

  • Наборы данных и прямая ADO.NET, и привязать набор данных непосредственно к элементам управления экрана ** написать прямой код SQL для загрузки набора данных ** использоватьпредставления в базе данных для загрузки набора данных ** использование хранимых процедур для загрузки набора данных

  • объекты NHibernate и DTO / Viewmodel ** Я обычно использую представления при переходе по этому маршруту - я будусоздайте набор представлений поверх схемы моего домена, который денормализует данные в нужную мне модель, а затем с помощью NH загрузите их с помощью второго набора карт

  • DTO /Automapper from domain model ** Мне не нравится этот подход, если я не знаю, что у меня уже есть все из моей доменной модели, загруженной в память.Я буду использовать такой инструмент, как Automapper, для переноса данных из моей доменной модели в DTO / ViewModel

Я уверен, что есть другие варианты, но это те, которые я использую больше всегочасто в порядке того, как часто я их использую.все они имеют свои собственные затраты / выгоды.но важно понимать, что вы можете и должны получать данные таким образом, чтобы вам было удобно заполнять свои экраны.

4 голосов
/ 17 июля 2010

Я думаю, что люди упускают смысл CQS (или CQRS, то же самое на самом деле). CQR - это просто образец, чтобы сказать, что у вас должны быть отдельные модели для чтения и записи. Что это за модель, полностью соответствует вашим требованиям к реализации.

Люди, которые говорили об этом в последнее время, обычно описывают чрезвычайно простые архитектуры и реализации, чтобы показать, что большинство корпоративного программного обеспечения, написанного сегодня, чрезмерно разработано и перегружено.

2 голосов
/ 07 октября 2014

Одним из преимуществ подхода CQRS ES является то, что вы можете разработать действительно простое (быстро читаемое) представление данных. В результате потока событий вы можете формировать свои данные со стороны чтения любым удобным для вас способом. Поэтому многим людям нравится отменять нормализацию данных, чтобы они были оптимизированы для чтения. Вы, конечно, не должны. Но почему бы и нет? Подумайте о частоте чтения в типичном большом объекте по сравнению с записью.

На всякий случай, если вы сочтете это полезным и хотели бы увидеть примеры кода, я написал более подробный ответ в своем блоге. Вы можете найти пост здесь: http://danielwhittaker.me/2014/10/05/build-master-details-view-using-cqrs-event-sourcing/

2 голосов
/ 18 февраля 2010

Если вы хотите работать с различными измерениями в своих представлениях, проблем не возникает. Есть замечание, что вы не можете использовать несколько моделей вида ниже вида. Денормализатор отвечает за заполнение представлений базы данных правильными данными. Посмотрите этот пост, он объясняет, как работает денормализатор, и может направить вас в правильном направлении относительно вашего вопроса.

...