Domain Driven Design поощряет использование богатой модели домена. Это означает, что вся логика домена находится в модели домена и что модель домена является высшей. Стойкость становится внешней проблемой, поскольку сама модель домена в идеале ничего не знает о сохранении (например, в базе данных).
Я использовал это на практике в проекте с одним человеком среднего размера ( > 100 тыс. строк Java), и я обнаруживаю много преимуществ, в основном гибкость и релятивируемость, которые это предлагает в отношении подхода, ориентированного на базу данных. Я могу добавлять и удалять классы домена, ударять несколько кнопок и всю новую схему базы данных, а слой SQL выкатывается.
Тем не менее, я часто сталкиваюсь с проблемами, когда мне сложно согласовать логику богатого домена с тем фактом, что база данных SQL поддерживает приложение. В общем, это приводит к типичной проблеме "1 + N запросов", где вы выбираете N объектов, а затем выполняете нетривиальный метод для каждого объекта, который снова вызывает запросы. Оптимизация этого вручную позволяет выполнять этот процесс в постоянном количестве SQL-запросов.
В моем проекте я разрешаю системе подключать эти оптимизированные версии. Я делаю это, перемещая код в "модуль запроса", который содержит десятки запросов, специфичных для домена (например, getActiveUsers), из которых у меня есть оба -memory (наивные и не масштабируемые) и SQL-based (для использования в развертывании). Это позволяет мне оптимизировать горячие точки, но есть два основных недостатка:
- Я фактически перемещаю часть своей логики домена в места, где она действительно не принадлежит, и фактически даже подталкивает ее к операторам SQL.
- Процесс требует, чтобы я просматривал журналы запросов, чтобы узнать, где находятся горячие точки, после чего я должен реорганизовать код, уменьшая абстракцию уровня, опуская его в запросы.
Есть ли лучший, более чистый способ согласования Domain-Driven-Design и его богатой модели домена с тем фактом, что вы не можете иметь все свои сущности в памяти и поэтому ограничены базой данных базы данных?