Дизайн активации учетной записи электронной почты (с учетом Hibernate) - PullRequest
0 голосов
/ 04 мая 2009

У меня проблема с дизайном, о которой я хотел бы узнать. Вот ограничения:

  1. Каждый пользователь должен иметь рабочий адрес электронной почты при регистрации своей учетной записи. При регистрации учетной записи пользователя необходимо отправить электронное письмо для активации, содержащее ссылку с кодом активации, по которому необходимо активировать учетную запись.
  2. Каждая учетная запись пользователя существует только в одном офисе, который существует только в одной компании.
  3. Первый зарегистрированный пользователь из компании создает компанию и один офис. Остальные пользователи компании затем приглашаются первым пользователем.
  4. Компании могут взаимодействовать друг с другом, но только в том случае, если активированы первые пользователи компаний (т. Е. Они щелкнули соответствующие ссылки активации после регистрации).

Вот небольшая UML-диаграмма того, как ее можно решить:

alt text

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

Некоторые мысли и вопросы:

  • User и NotActivationUser в основном совпадают. Должны ли они быть одним классом или отделены? Если бы они были разделены, какую форму сохранения наследования Hibernate вы бы использовали?
  • Если учетная запись не активируется через определенное время, ее следует удалить. Если это был первый пользователь, который также создал пользователей Company и Office, то оба из них также должны быть удалены. Нужны ли нам также NotActivationOffice и NotActivationCompany? (Для чистого разделения в базе данных.)

Как бы вы разработали такое решение? Считаете ли вы важным хранить неактивные и активные объекты отдельно в базе данных? Почему или почему нет?

Ответы [ 4 ]

1 голос
/ 04 мая 2009

Я бы не использовал наследование для представления состояния (активировано / деактивировано) ваших пользовательских объектов. Композиция (агрегация) здесь намного лучше.

Используя агрегацию, AbstractUser просто становится пользователем. Возможно, вы захотите смоделировать активацию с помощью класса, а не загрязнять класс пользователя атрибутами, связанными с активацией. Таким образом, вы получите красивую и чистую объектную модель.

На уровне базы данных вы все еще можете решить сохранить два объекта в одной таблице / записи, известной как Сопоставление компонентов . Или вы можете решить хранить пользователя и активацию в отдельных таблицах (или Отображение сущности ).

Hibernate поддерживает оба типа отображений, в основном это вопрос конфигурации.

Класс User будет содержать следующие атрибуты:

  • GivenName
  • фамилия
  • Адрес электронной почты
  • активация (ссылка на объект активации)

Класс активации будет содержать следующие атрибуты:

  • код активации (строка)
  • sentOn (когда было отправлено письмо)
  • activOn (по умолчанию null, устанавливается на текущую дату / время, когда пользователь щелкает ссылку активации, сообщает системе, активировал ли пользователь свою учетную запись, когда не имеет значение null)

Вы можете использовать HQL-запрос, чтобы узнать, в какой компании есть хотя бы один активированный пользователь:

from Office o 
   left join fetch o.company 
where 
   o.administrator.activatedOn != null

В этом запросе предполагается, что вы определили атрибут «администратор» в своем классе Office. «Администратор» - это ссылка на пользователя, который создал Office. В базе данных таблица «офисы» имеет внешний ключ к записи пользователя.

Моделируя отношения таким образом, вы можете сменить Администратора Офиса (например, он ушел или был уволен из Офиса / Компании). Все зависит от ваших вариантов использования ...

Я также добавил атрибут sentOn в класс Activation, используемый для очистки инактивированной учетной записи через некоторое время (отсутствовало в диаграмме UML).

0 голосов
/ 04 мая 2009

Лично я не написал бы два класса для активированных и неактивированных пользователей, потому что это просто состояние. Если это состояние до активации становится сложным, вы можете сослаться на состояние активации или тому подобное.

Если у вас есть флаг «OfficeOwner» для пользователя, вы знаете, когда удалять офис без какой-либо сложной логики.

0 голосов
/ 04 мая 2009

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

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

0 голосов
/ 04 мая 2009

Я бы не отделял NotActivationUser от ActivatedUser; просто есть таблица пользователей и столбец для «Активировано», по умолчанию 0 (не активировано).

Одна вещь; Я бы выделил код активации в отдельную таблицу, возможно, с помощью «ActivationMethod». Это обеспечивает возможность расширения в будущем, если вы хотите, чтобы у пользователя был способ активировать свою учетную запись, отличную от электронной почты, а также служит для удаления столбца ActivationCode из таблицы User.

Я бы не беспокоился о неактивированных офисах и компаниях; в соответствии с вашими планами использования, как описано выше, они не могут быть использованы кем-либо еще, пока этот пользователь не активирует себя (и, следовательно, офис и компанию). Один вопрос; почему вы позволяете не активированному пользователю создавать офис и компанию? Почему бы не ограничить эту деятельность только активированными пользователями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...