По-перше, я хочу сказати, що це здається занедбаним питанням / областю, тому, якщо це питання потребує вдосконалення, допоможіть мені зробити це чудовим питанням, яке може принести користь іншим! Я шукаю поради та допомоги у людей, які реалізували рішення, що вирішують цю проблему, а не лише ідеї, які слід спробувати.
На мій досвід, є дві сторони програми - сторона "завдання", яка в значній мірі керується доменом і є те, де користувачі сильно взаємодіють з доменною моделлю ("двигуном" програми) та стороною звітування, де користувачі отримати дані на основі того, що відбувається на стороні завдання.
З боку завдання зрозуміло, що програма з багатою доменною моделлю повинна мати ділову логіку в доменній моделі, а базу даних слід використовувати переважно для наполегливості. Розділення проблем, кожна книга про це написана, ми знаємо, що робити, приголомшливо.
Що щодо звітної сторони? Чи є сховищами даних прийнятними, чи вони поганий дизайн, оскільки вони включають ділову логіку в базу даних та самі дані? Щоб об'єднати дані з бази даних у сховища даних, ви повинні застосувати до них логіку бізнесу та правила, і щоб логіка та правила не виходили з вашої доменної моделі, а виходили з ваших процесів агрегації даних. Це неправильно?
Я працюю над великими програмами управління фінансами та проектами, де логіка бізнесу є великою. Коли я повідомляю про ці дані, мені часто потрібно буде зробити багато агрегацій, щоб витягнути інформацію, необхідну для звіту / інформаційної панелі, і агрегація містить у собі багато ділової логіки. Заради ефективності я робив це з високо агрегованими таблицями та збереженими процедурами.
Наприклад, скажімо, що для показу списку активних проектів потрібен звіт / інформаційна панель (уявіть 10000 проектів). Кожен проект потребує набору показань, показаних разом із ним, наприклад:
- загальний бюджет
- зусилля на сьогоднішній день
- швидкість опіку
- дата вичерпання бюджету при поточній швидкості спалювання
- тощо.
Кожне з них передбачає багато ділової логіки. І я кажу не просто про множення чисел чи просту логіку. Я говорю про те, щоб отримати бюджет, ви повинні застосувати таблицю тарифів з 500 різними ставками, по одній на час кожного працівника (для деяких проектів, інші мають мультиплікатор), застосовуючи витрати та будь-яку відповідну націнку тощо. логіка обширна. Щоб отримати ці дані за розумну кількість часу, клієнту знадобилося багато агрегування та налаштування запитів.
Чи слід це спочатку запустити через домен? А як щодо продуктивності? Навіть при прямих SQL запитах я ледве отримую ці дані досить швидко, щоб клієнт відображався за розумну кількість часу. Я не уявляю, як намагаюсь отримати ці дані клієнту досить швидко, якщо я регідратаю всі ці об’єкти домену та змішую, узгоджую і агрегую їх дані на рівні додатків, або намагаюся агрегувати дані в додатку.
У цих випадках здається, що SQL добре розбиває дані, а чому б не використовувати їх? Але тоді у вас є ділова логіка поза вашою доменною моделлю. Будь-яку зміну бізнес-логіки доведеться змінити у вашій моделі домену та ваших схемах агрегації звітів.
Я дуже втрачаю те, як розробити частину будь-якої програми звітування / інформаційної панелі щодо дизайну та належних практик.
Я додав тег MVC, тому що MVC - це дизайнерський смак дю пурі, і я використовую його в моєму теперішньому дизайні, але не можу зрозуміти, як дані звітів вписуються в цей тип додатків.
Я шукаю будь-якої допомоги в цій галузі - книги, шаблони дизайну, ключові слова в Google, статті, будь-що. Я не можу знайти жодної інформації на цю тему.
РЕДАКТУЙТЕ ТА ІНШИЙ ПРИКЛАД
Ще один ідеальний приклад, який я натрапив сьогодні. Клієнт хоче звіту для Команди з продажу клієнтів. Вони хочуть того, що здається простим показником:
Для кожного продавця, який їх річний обсяг продажів на сьогоднішній день?
Але це складно. Кожен продавець брав участь у кількох можливостях продажу. Деякі вони виграли, деякі - ні. У кожній можливості продажу є кілька людей з продажу, котрим кожному виділяється відсоток кредиту на продаж відповідно до їх ролі та участі. Отже, тепер уявіть, що ви перейдете через домен для цього ... кількість регідратації об'єкта, яку вам доведеться зробити, щоб витягнути ці дані з бази даних для кожного продавця:
Отримайте всі
SalesPeople
->
Для кожного отримайте їхSalesOpportunities
->
Для кожного отримайте свій відсоток від продажу та обчисліть їхню суму продажу,
а потім складіть всю своюSalesOpportunity
суму продажів.
І це ОДНА метрика. Або ви можете написати SQL-запит, який може зробити це швидко та ефективно та налаштувати його на швидкий.
EDIT 2 - Шаблон CQRS
Я читав про шаблон CQRS і, хоча інтригує, навіть Мартін Фаулер каже, що це не перевірено. Отже, як ця проблема була вирішена в минулому. З цим мали зіткнутися всі в той чи інший момент. Що є усталеним або добре зношеним підходом із результатами успіху?
Редагування 3 - Системи / Інструменти звітності
Інша річ, яку слід враховувати в цьому контексті, - це інструменти звітності. Служби звітування / Crystal Reports, служби аналізу та Cognoscenti тощо, всі очікують на отримання даних із SQL / бази даних. Сумніваюся, ваші дані надійдуть через ваш бізнес пізніше. І все ж вони та інші подібні до них є життєво важливою частиною звітності у багатьох великих системах. Яким чином дані для них правильно обробляються, коли є навіть бізнес-логіка у джерелі даних для цих систем, а також, можливо, у самих звітах?