Как объекты-значения хранятся в базе данных?
-
21-08-2019 - |
Вопрос
На самом деле я не видел никаких примеров, но предполагаю, что они сохраняются внутри таблицы сущностей в базе данных.
Т.е.Если у меня есть корневая сущность/агрегат Person и соответствующая таблица Person, если бы у нее был объект Value с именем Address, значения адреса были бы сохранены внутри этой таблицы Person!
Имеет ли это смысл для домена, где у меня есть другие объекты, такие как компании и т. д.у которых есть адрес?
(Сейчас я пишу приложение для управления проектами и пытаюсь проникнуть в DDD)
Решение
Объекты-значения можно хранить в отдельной таблице по тем же причинам, которые вы описали.Однако я думаю, что вы неправильно понимаете сущности и ВО - это не проблема, связанная с постоянством.
Вот пример:
Предположим, что Компания и Человек у обоих одна и та же почта Адрес.Какое из этих утверждений считать справедливым?
- «Если я изменяю компанию. Address, я хочу, чтобы Person.dress автоматически получил эти изменения»
- «Если я изменяю company.address, это не должно влиять на человека.
Если 1 правда, Адрес должно быть Сущность, и поэтому имеет собственную таблицу
Если 2 правда, Адрес должно быть Объект значения.Он может храниться как компонент в таблице родительского объекта или иметь собственную таблицу (лучшая нормализация базы данных).
Как видите, способ сохранения адреса не имеет ничего общего с семантикой Entity/VO.
Другие советы
Большинство разработчиков склонны в первую очередь думать о базе данных, прежде чем обо всем остальном.DDD не знает, как обрабатывается постоянство.Репозиторий должен разобраться с этим.Вы можете сохранить его как XML, sql, текстовый файл и т. д. и т. п.Объекты сущностей/агрегатов/значений — это концепции, относящиеся к предметной области.
Объяснение Виджая Пателя идеально.
Я начал изучать DDD на примере книги Эрика Эванса и превосходного проекта dddsample Cargo. http://dddsample.sourceforge.net/
Так что для тех (как я), кто хочет материализовать разницу в реализации кода этого нюанса на уровне модели предметной области, я бы сказал:
Переопределенный метод Equals или/и SameIdentityAs/SameValueAs (из интерфейса Entity и ValueObject), я думаю, является местом их выражения.
Это просто мое ощущение :)
Мне тоже кажется интересно это прочитать: