2016-02-19 3 views
4

Лучшим примером может быть объект User, который необходимо сохранить. У меня есть следующие кандидаты для присвоения пользователю уникального идентификатора:Когда и как назначить уникальный идентификатор объекту в DDD?

  1. Назначить ключи, предоставляемые с помощью back-end (NDB, MySQL и т. Д.).
  2. Ручная работа с уникальным идентификатором через какой-либо сервис (например, системные часы).
  3. Свойства, такие как emailId.

Принимая простой пример детального зрения, мы часто подробный показ пользователя как some/path/users/{user_id}, если мы будем EMAILID как уникальный идентификатор, то есть вероятность того, что пользователь может изменить свой электронный идентификатор один день и ломает его.

Каков наилучший подход к идентификации одного и того же объекта?

+1

Возможный дубликат [Domain Increaseded Entity Key], разработанного под управлением домена, (http://stackoverflow.com/questions/34315605/domain-driven-design-auto-incremented-entity-key) – theDmi

+0

В зависимости от ваших требований все три представленного выбора можно было бы считать «хорошей стратегией». – Cerad

ответ

3

Именованный UUID.

UUID, поскольку он дает идентификатору хорошую предсказуемую структуру без каких-либо семантических последствий (например, пример вашего идентификатора электронной почты). Подумайте, surrogate key.

Идентифицировано UUID, поскольку вы хотите, чтобы сгенерированный идентификатор был детерминированным. Детерминированные средства воспроизводятся: вы можете переместить вашу систему в тестовую среду и выполнить команды повторного воспроизведения для проверки результатов.

Он также дает вам дополнительный способ обнаружить дублируемую работу - что должно произойти в вашей системе, если повторяется команда пользователя-пользователя (например: пользовательские POST-файлы одной и той же веб-формы дважды). Существуют различные способы защиты от этого в ваших промежуточных слоях, но очень простой способ охватить это в вашем уровне персистентности (например, в вашей системе записи) - это установить ограничение уникальности для идентификатора. Поскольку запуск второй команды создает «новый» пользовательский объект с одним и тем же идентификатором, слой persistence будет возражать против дублирования, и вы можете обрабатывать вещи оттуда.

Таким образом, вы получаете обработку идемпотентной команды, даже если все промежуточные уровни защиты перезапускаются в течение интервала между дублируемыми командами.

Именованный UUID предоставляет вам эти свойства; например, вы можете создать uuid из идентификатора для типа объекта и идентификатора команды (дублируемая команда будет иметь тот же самый идентификатор, когда он будет повторно).

Вы можете использовать переходные свойства пользователя (например, адрес электронной почты) как часть семени для вашего имени uuid, если у вас есть гарантия того, что свойство никогда не будет назначено кому-то другому. Вы уверены, что [email protected] не будет назначен другому пользователю? Тогда это не хорошее семя для использования.

Назначение ключей конечного конца не обнаруживает столкновение, если команда дублируется - вам нужно будет использовать другой бит состояния для обнаружения столкновения.

Системные часы не являются хорошим выбором, потому что это затрудняет воспроизведение одинакового идентификатора. Локальная копия системных часов может работать, если вы можете воспроизводить обновления локальных часов в тестовой среде. Но это куча дополнительных усилий, которых вы не хотите, если время еще не является частью вашей модели домена.

0

Я согласен с @VoiceOfUnreason, но только частично. Мы все знаем, что UUID ужасны для написания и отслеживания. Все методы использования инкрементных и значимых UUID разрешают только части этих проблем.

Совокупность создается с некоторым идентификатором, который уже доступен для создающей стороны. Хотя UUID может быть сгенерирован без привлечения каких-либо внешних компонентов, это не единственное решение. Использование внешнего поставщика удостоверений, таких как Twitter Snowflake (отставной), также является вариантом.

Не очень сложно создать очень простой и надежный поставщик удостоверений, который может возвращать возрастающее длинное значение, получая общее имя типа.

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

Смежные вопросы