Скажем, у меня есть две таблицы, user
и comment
.У них есть определения таблиц, которые выглядят следующим образом:
CREATE TABLE `user` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`deleted` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY (`username`)
) ENGINE=InnoDB;
CREATE TABLE `comment` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`user_id` INTEGER NOT NULL,
`comment` TEXT,
`deleted` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
CONSTRAINT `fk_comment_user_id` FOREIGN KEY (`user_id`)
REFERENCES `user` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
Это отлично подходит для обеспечения целостности данных и всего такого, но я хочу иметь возможность "удалить" пользователя и сохранить все его комментарии (для справки).
С этой целью я добавил deleted
, чтобы я мог SET deleted = 1
в записи.Перечисляя все с помощью deleted = 0
по умолчанию, я могу скрыть все удаленные записи, пока они мне не понадобятся.
Пока все хорошо.
Проблема возникает, когда:
- Пользователь подписывается с именем пользователя (скажем, "Сэм"),
- Я удаляю этого пользователя (по несвязанным причинам) и
- Кто-то другой приходит, чтобы подписатькак Сэм, и вдруг мы нарушили уникальное ограничение на
user
.
Я хочу, чтобы пользователи могли редактировать свои собственные имена пользователей, поэтому я не должен делать username
первичными у нас все еще будет та же проблема при удалении пользователей.
Есть мысли?
Редактировать для уточнения: Добавлено после ответа RedFilter и комментариев ниже.
Я обеспокоен случаем, когда «удаленные» пользователи и комментарии не видны публике, но видны только администраторам или хранятся для целей статистики.
Этот вопросэто мысленный эксперимент, с пользователем и комментарием тв состоянии просто быть примерами.Тем не менее, username
не был лучшим для использования;RedFilter делает правильные замечания о личности пользователя, особенно когда записи представлены в открытом контексте.
Относительно " Почему имя пользователя не является первичным ключом? ": это всего лишь пример,но если я применю это к реальной проблеме, мне нужно будет работать в рамках ограничений существующей системы, предполагающей существование суррогатного первичного ключа.