2010-08-27 4 views
4

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

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

Другим вариантом было просто отметить запись пользователя как съемную и не сделать ее доступной как часть пользовательских запросов. Это теоретически означает, что ни один пользователь не может быть удален из системы и может быть проблемой, если кто-то захочет использовать аналогичный loginid как удаленный пользователь.

Хотели бы узнать, как другие решают эту проблему?

ответ

11

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

Это имеет два преимущества:

  • не затыкать внешние ключи с другими таблицами; и
  • он сохраняет все данные в случайном случае, что вам необходимо восстановить их в какой-то момент.

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

Это может быть использовано для создания аналогичной схемы для SO. Когда пользователи «исчезают», вопросы и ответы, созданные ими, по-прежнему содержат информацию об авторе, но она неактивна.

Если вы указали информацию о пользователе (или даже если у вас был один пользователь Unknown, чтобы назначить сообщения, если вы не хотите разрешать NULL), у вас не будет этой информации.

+1

+1 всегда мягкое удаление пользователей. Кроме того, часто в целях аудита имя пользователя сохраняется, а не идентификатор пользователя FK, на всякий случай, если тупой администратор воскрешает неактивного пользователя и переназначает идентификатор новому сотруднику. – StuartLC

+0

С этим могут возникнуть некоторые проблемы с защитой данных, поэтому запустите его мимо адвоката или кого-то, кто по крайней мере похож на адвоката. –

+1

Обычно я устанавливаю удаленный столбец в true, когда пользователь удаляется, а для рабочих запросов выбирают только пользователей с удаленным = false – KoolKabin

2

Я бы пошел с подходом, о котором вы упоминали последний, используя Soft Delete. Имейте флаг «Active» и отмечайте его как неактивный после удаления пользователя.

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

В этом случае вы можете использовать один и тот же идентификатор пользователя - до тех пор, как вы сделаете чек, что нет никакого другого «Активного» пользователя - не позволяют старому пользователю повторно активировать его Id, если есть не является другим «активным» пользователем

Однако для этого подхода требуется, чтобы внешний ключ для всех других таблиц был отдельным столбцом типа IDENTITY, а не вашим идентификатором пользователя. При условии, что это сделано (и что МОЖЕТ потребовать много изменений схемы, если вы уже не используете идентификаторы), я не вижу других потенциальных проблем с этим подходом.

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