Говоря с точки зрения домена, ID
, связанный с User
записью, является просто суррогатным ключом . Он не имеет соответствующего представления в реальном мире и предназначен только для того, чтобы помочь вам сохранить и извлечь данные.
Так что, если email
является уникальным полем для ваших User
записей, во что бы то ни стало, используйтеэто как если бы вы использовали идентификатор в вашей команде.
Это не обязательно означает, что вы можете избавиться от своего поля id
.
Вы все равно хотели бы иметь суррогатный ключкак поле id
в вашей записи User
, потому что вы можете дать своим пользователям возможность изменить свой адрес электронной почты. Даже с измененным адресом электронной почты вы должны иметь возможность однозначно идентифицировать пользователя во всей системе, и здесь вам пригодится суррогатный ключ. Вы также хотели бы суррогатный ключ по причинам производительности;почти всегда лучше использовать поле Integer
или UUID
вместо String
адреса электронной почты в качестве первичного ключа или в ссылочных полях.
Вы также должны различать Command
иего соответствующий Command Handler
. Command
- это просто DTO, который включает изменения, произошедшие во внешнем мире, или изменения, которые необходимо зафиксировать в базе данных. В этом смысле они являются неизменяемыми и не должны выполнять запросы или обновлять себя каким-либо образом.
A Command Handler
(который по своей природе аналогичен службе приложений, но имеет фоновое представление) потребляет данные в команде. Там вы можете запросить свой репозиторий и получить записи. Фактически, это будет необходимо для проверки дубликатов или ссылочных ключей любого типа.