Креш-тест: многослойная система для крупной финансовой организации


Константин пишет:

— Допустим, мы разрабатываем многослойную систему для крупной финансовой организации. Нормально ли иметь персистенс модели длиной в сотни строк кода с десятками свойств? Обычно я ответил бы — нет, не нормально, но тут сами спецификации содержат описания таких огромных моделей (масса показателей, коэффициентов, дат и всего прочего). Более того, вью модели тоже, как по мне, перегружены: множество свойств. Но это требование заказчика! Т. е., с ума сойти, но конечный пользователь, по идее, обожает таблицы из сотен строк и десятков столбцов!

Вот отсюда и мой вопрос: это нормально для любой предметной области или это специфика конкретной предметной области, для которой разрабатывается ПО, или это вообще ненормально и что тогда с этим делать?

Здравствуйте, Константин.

Запросто, но это будет только мое мнение. Да и вопрос очень абстрактный. В реальном диалоге, я бы ограничился простым «Да, так бывает» и послушал бы дальше :) Но, так как это переписка, смотрите ниже.

Насколько мне известно, ни одна спецификация persistence layer не ограничивает сложность объектов. Так то единственное ограничение, которым следует руководствоваться в данном случае — это физические ограничения используемой RDBMS (например, PostgreSQL поддерживает «всего» 4096 колонок в одной таблице). Так что с точки зрения дизайна, модели с десятками и сотнями свойств — это нормально.

Что касается второй части Вашего вопроса — любая задача специфична для предметной области. Любая. Именно поэтому не существует строгих спецификаций и гарантировано работающих правил создания persistence layer, или SOA, или чего бы то ни было. Вероятно в Вашем случае необходимо сохранять именно такой объем информации именно в такой форме. Это, между прочим, не значит, что заказчик обожает непомерные таблицы, которые очень сложно читать. Уровень представления может очень сильно отличаться от уровня persistence. Это, прежде всего, значит, что заказчик хочет хранить всю эту информацию в одном месте, доступно для редактирования, и просто для резервного копирования.

Еще один момент, как бы странно это ни звучало, но с точки зрения производительности, одна, пусть даже очень большая таблица, лучше (при прочих равных условиях) двух десятков маленьких, связанных друг с другом множеством связей. В очень редких случаях, это не так. Другое дело, что поддерживать такие сущности действительно сложно.

И последнее, что можно с этим сделать. Не зная предметной области, Ваших отношений с заказчиком, степени Вашего влияния на принятие решений, степеней Вашей свободы в изменении архитектуры, кода и дизайна проекта, могу дать только общие советы. Также, я не знаю языка и платформы, на которой Вы работаете, поэтому рекомендации будут опираться на Java + JPA.

  1. Попытайтесь проанализировать структуру сущностей. Действительно ли они столь монолитны и неделимы, насколько это реализовано. Все ли эти десятки и сотни полей нужны каждый раз, когда происходит выборка сущности. Если это не так (разумеется, здесь будет сложный разговор с заказчиком) то
    1. «лишние» атрибуты имеет смысл разделить на логические группы
    2. вынести каждую из групп в отдельную сущность, связанную с основной и помеченной fetch = FetchType.LAZY.
    3. таким образом, Вы сможете существенно снизить нагрузку на память и на RDBMS, не потеряв при этом данных, связей и существенно упростив себе жизнь.
  2. Если же сущности действительно монолитны и неделимы, то логически сгруппировать поля все равно стоит. Но вместо связных сущностей можно использовать @Embeeded объекты. Этот термин хорошо знаком людям, которые работают с Hibernate, суть такого рефакторинга заключается в том, что большая таблица из RDBMS представляется набором объектов уровня ORM. Физически мы будем иметь единую и неделимую таблицу с огромным количеством полей, логически — иерархию объектов, заполненных данными из этой таблицы.

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

Резюмируя, могу сказать, что описанная ситуация нормальна. Реализация может быть сделана не самым оптимальным образом, возможно, ее можно улучшить и сделать более читабельной. Но если бизнес-задача решена, то это именно то, зачем вообще разрабатывается ПО. Более того, RDBMS поддерживает большое количество строк и столбцов именно потому, что некоторые задачи требуют именно такой организации данных. Так что все, что можно сделать для улучшения модели — разделить ее логически и, если это необходимо и приемлемо, физически. Насколько сильно, сейчас сказать не могу.

Присылайте свои вопросы через форму — dou.wufoo.com/forms/nnnnn. Ответы — каждый понедельник.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn

4 коментарі

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

Вот отсюда и мой вопрос: это нормально для любой предметной области или это специфика конкретной предметной области

есть два подхода
rich
и

anemic

спорам не один год, можно погуглить.
из краткого свежее —

Несколько слов в защиту шаблона «Анемичная модель предметной области» (Anemic Domain Model)

можно только сказать, что если проект уже реализован, и работает не один год — то сменить Domain Model в приемлимые сроки с приемлимыми затратами наверное невозможно.

Я больше склоняюсь к «анемичной» модели предметной области. Это позволяет лучше разделять доменные модели и правила. Но вместе с тем не вижу причин запрещать добавить в модели вычислимые поля или методы, которые не меняют состояние. Так что эти два подхода не взаимоисключающие, а скорее две противоположные крайности.

Вопрос слишком абстрактный — это точно.
О каких именно моделях идет речь?
Если это персистенс-модели то их специфика определяется выбранной СУБД и способом доступа. Много полей в одной таблице — не критично, если соблюдается «нормальная форма» и не страдает целостность данных.
Если это вью-модели то их специфика определяется требованиями пользовательского интерфейса. Если пользователи хотят видеть «простыни» с кучей колонок то и в модели будет много пропертей.
А вот если это доменные модели то тут уже не заказчик должен требовать, а архитектор работать.
Доменная модель должна отражать сущности предметной области и удовлетворять SOLID принципам, поэтому вполне логично применить Interface segregation и получить множество связанных моделей с небольшим количеством пропертей.
Плюсы такого решения в большей понятности, гибкости, расширяемости и упрощении моков для юнит-тестов.
Минусы в дополнительной работе по «раскладыванию» персистенс-модели по доменным моделям и последующем «сборе» результата работы бизнес-логики во вью-модели.
Поэтому такое оправданно только если бизнес-логика нетривиальная. Если же большинство функций это «достали из базы — показали — положили обратно» то декомпозиция моделей не нужна.

Кстати, имея много простых моделей-интерфейсов никто не запрещает объединить их реализацию в одном классе с кучей пропертей (нужном для персистенса или передачи по сети одним куском).

Может быть стоит почитать www.ozon.ru/...ail/id/5497184 и обратить внимание на главы о выделении Сущностей и Агрегатов.

Сомневаюсь в существовании немыслимо сложных систем, поскольку, с любой системой работают обычные люди и все стандартные правила типа 3 сущностей, 1:7, 20:80, и т д никто не отменял.

Нереально сложным может быть отображение среза простой предметной области в некоторое информационное поле. То есть 7 простых сущностей пораждают 7!=5040 их перестановок. Возможно в ТЗ показывают именно эту картину, а не 7 простых сущностей, которых, кстати, могут и сами не знать.

Підписатись на коментарі