Именованный UUID.
UUID, поскольку он дает идентификатору хорошую предсказуемую структуру без каких-либо семантических последствий (например, пример вашего идентификатора электронной почты). Подумайте, surrogate key.
Идентифицировано UUID, поскольку вы хотите, чтобы сгенерированный идентификатор был детерминированным. Детерминированные средства воспроизводятся: вы можете переместить вашу систему в тестовую среду и выполнить команды повторного воспроизведения для проверки результатов.
Он также дает вам дополнительный способ обнаружить дублируемую работу - что должно произойти в вашей системе, если повторяется команда пользователя-пользователя (например: пользовательские POST-файлы одной и той же веб-формы дважды). Существуют различные способы защиты от этого в ваших промежуточных слоях, но очень простой способ охватить это в вашем уровне персистентности (например, в вашей системе записи) - это установить ограничение уникальности для идентификатора. Поскольку запуск второй команды создает «новый» пользовательский объект с одним и тем же идентификатором, слой persistence будет возражать против дублирования, и вы можете обрабатывать вещи оттуда.
Таким образом, вы получаете обработку идемпотентной команды, даже если все промежуточные уровни защиты перезапускаются в течение интервала между дублируемыми командами.
Именованный UUID предоставляет вам эти свойства; например, вы можете создать uuid из идентификатора для типа объекта и идентификатора команды (дублируемая команда будет иметь тот же самый идентификатор, когда он будет повторно).
Вы можете использовать переходные свойства пользователя (например, адрес электронной почты) как часть семени для вашего имени uuid, если у вас есть гарантия того, что свойство никогда не будет назначено кому-то другому. Вы уверены, что [email protected] не будет назначен другому пользователю? Тогда это не хорошее семя для использования.
Назначение ключей конечного конца не обнаруживает столкновение, если команда дублируется - вам нужно будет использовать другой бит состояния для обнаружения столкновения.
Системные часы не являются хорошим выбором, потому что это затрудняет воспроизведение одинакового идентификатора. Локальная копия системных часов может работать, если вы можете воспроизводить обновления локальных часов в тестовой среде. Но это куча дополнительных усилий, которых вы не хотите, если время еще не является частью вашей модели домена.
Возможный дубликат [Domain Increaseded Entity Key], разработанного под управлением домена, (http://stackoverflow.com/questions/34315605/domain-driven-design-auto-incremented-entity-key) – theDmi
В зависимости от ваших требований все три представленного выбора можно было бы считать «хорошей стратегией». – Cerad