Во-первых, я хочу сказать, что этот вопрос / область игнорируется, поэтому, если этот вопрос нуждается в улучшении, помогите мне сделать этот замечательный вопрос, который может принести пользу другим! Я ищу советы и помощь от людей, которые внедрили решения, которые решают эту проблему, а не просто идеи, чтобы попробовать.
По моему опыту, есть две стороны приложения - сторона «задачи», которая в значительной степени зависит от домена и где пользователи активно взаимодействуют с моделью домена («движок» приложения) и сторона отчетности, где пользователи получить данные на основе того, что происходит на стороне задачи.
Что касается задачи, то ясно, что приложение с моделью расширенного домена должно иметь бизнес-логику в модели домена, а базу данных следует использовать в основном для сохранения. Разделение проблем, каждая книга написана об этом, мы знаем, что делать, круто.
А как насчет отчетности? Приемлемы ли хранилища данных или они плохо спроектированы, потому что включают в себя бизнес-логику в базе данных и сами данные? Чтобы объединить данные из базы данных в данные хранилища данных, вы должны применить бизнес-логику и правила к данным, и чтобы логика и правила исходили не из вашей доменной модели, а из ваших процессов агрегирования данных. Это неправильно?
Я работаю над крупными финансовыми приложениями и приложениями для управления проектами, где бизнес-логика обширна. При составлении отчетов об этих данных у меня часто будет МНОГО агрегатов, чтобы извлечь информацию, необходимую для отчета / панели мониторинга, и в агрегациях много бизнес-логики. Ради производительности я делал это с помощью высоко агрегированных таблиц и хранимых процедур.
В качестве примера предположим, что для отображения списка активных проектов необходим отчет / панель инструментов (представьте 10 000 проектов). Каждому проекту потребуется набор метрик, показанных вместе с ним, например:
- общий бюджет
- усилия на сегодняшний день
- скорость горения
- дата исчерпания бюджета при текущей скорости записи
- и т.п.
Каждый из них включает в себя много бизнес-логики. И я говорю не только о умножении чисел или какой-то простой логике. Я говорю о том, чтобы получить бюджет, вы должны применить таблицу тарифов с 500 различными тарифами, по одному на время каждого сотрудника (в некоторых проектах у других есть множитель), с учетом расходов и любой соответствующей наценки и т. Д. логика обширна. Потребовалось много агрегации и настройки запросов, чтобы получить эти данные за разумное время для клиента.
Должно ли это сначала выполняться через домен? Как насчет производительности? Даже с прямыми SQL-запросами я едва получаю эти данные достаточно быстро, чтобы клиент отображал их в разумные сроки. Я не могу себе представить, чтобы попытаться передать эти данные клиенту достаточно быстро, если я перекомпилирую все эти доменные объекты, и смешиваю и сопоставляю и объединяю их данные на прикладном уровне, или пытаюсь объединить данные в приложении.
В этих случаях кажется, что SQL хорошо обрабатывает данные, и почему бы не использовать его? Но тогда у вас есть бизнес-логика вне вашей доменной модели. Любые изменения в бизнес-логике должны быть изменены в вашей доменной модели и ваших схемах агрегирования отчетов.
Я действительно в растерянности из-за того, как спроектировать часть отчетности / инструментальной панели любого приложения с точки зрения доменного дизайна и передового опыта.
Я добавил тег MVC, потому что MVC - это дизайн, и я использую его в своем текущем дизайне, но не могу понять, как данные отчетности вписываются в этот тип приложений.
Я ищу любую помощь в этой области - книги, шаблоны дизайна, ключевые слова для Google, статьи, что угодно. Я не могу найти информацию по этой теме.
РЕДАКТИРОВАТЬ И ДРУГОЙ ПРИМЕР
Еще один прекрасный пример, с которым я столкнулся сегодня. Клиент хочет получить отчет для отдела продаж. Они хотят что-то вроде простой метрики:
Каков годовой объем продаж для каждого продавца?
Но это сложно. Каждый продавец участвовал в нескольких возможностях продаж. Некоторые они выиграли, некоторые - нет. В каждой торговой возможности есть несколько продавцов, каждый из которых получает процент от продаж за свою роль и участие. Итак, теперь представьте, что вы пройдете через домен для этого ... количества регидратации объекта, которое вам нужно будет сделать, чтобы получить эти данные из базы данных для каждого продавца:
Получить все
SalesPeople
->
Для каждого получить своиSalesOpportunities
->
Для каждого получить свой процент от продажи и рассчитать сумму продаж, а
затем сложить все своиSalesOpportunity
суммы продаж.
И это ОДНА метрика. Или вы можете написать запрос SQL, который может сделать это быстро и эффективно и настроить его на быструю.
РЕДАКТИРОВАТЬ 2 - CQRS Pattern
Я читал о паттерне CQRS и, хотя и интригует, даже Мартин Фаулер говорит, что он не тестировался. Так как же эта проблема была решена в прошлом. С этим должны были сталкиваться все в тот или иной момент. Что такое устоявшийся или изношенный подход с успехом?
Редактировать 3 - Системы отчетности / Инструменты
Еще одна вещь, которую следует рассмотреть в этом контексте, это инструменты отчетности. Службы Reporting Services / Crystal Reports, Analysis Services и Cognoscenti и т. Д. Все ожидают данных из SQL / базы данных. Я сомневаюсь, что ваши данные поступят через ваш бизнес позже для них. И все же они и другие, подобные им, являются важной частью отчетности во многих крупных системах. Как правильно обрабатываются данные для них, если в источнике данных для этих систем, а также, возможно, в самих отчетах есть даже бизнес-логика?