Я занимаюсь разработкой в LAMP (Linux + Apache + MySQL + PHP), так как я себя помню. Но один вопрос беспокоил меня уже много лет. Я надеюсь, что вы можете помочь мне найти ответ и указать мне правильное направление. Вот мой вызов:
Скажем, мы создаем веб-сайт сообщества, где мы разрешаем нашим пользователям регистрироваться. Таблица MySQL, в которой мы храним всех пользователей, выглядела бы тогда так:
CREATE TABLE `users` (
`uid` int(2) unsigned NOT NULL auto_increment COMMENT 'User ID',
`name` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL COMMENT 'Password is saved as a 32-bytes hash, never in plain text',
`email` varchar(64) NOT NULL,
`created` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of registration',
`updated` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of profile update, e.g. change of email',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Итак, из этого фрагмента видно, что у нас есть уникальное и автоматически увеличивающееся поле для каждого нового пользовательского поля 'uid'. Как и на каждом хорошем и лояльном веб-сайте сообщества, мы должны предоставить пользователям возможность полностью удалить свой профиль, если они хотят отменить свое участие в нашем сообществе.
Вот и моя проблема. Допустим, у нас есть 3 зарегистрированных пользователя: Алиса (uid = 1), Боб (uid = 2) и Крис (uid = 3). Теперь Боб хочет удалить свой профиль и прекратить использовать наше сообщество. Если мы удалим профиль Боба из таблицы 'users', то его пропущенный 'uid' создаст пробел, который больше никогда не будет заполнен. На мой взгляд, это огромная трата UID. Я вижу 3 возможных решения здесь:
1) Увеличьте емкость поля 'uid' в нашей таблице с SMALLINT (int (2)) до, например, BIGINT (int (8)) и игнорируйте тот факт, что некоторые из uid будут потрачены впустую.
2) ввести новое поле 'is_deleted', которое будет использоваться для маркировки удаленных профилей (но вместо того, чтобы хранить их в таблице, а не удалять), чтобы повторно использовать их идентификаторы для вновь зарегистрированных пользователей. Таблица будет выглядеть так:
CREATE TABLE `users` (
`uid` int(2) unsigned NOT NULL auto_increment COMMENT 'User ID',
`name` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL COMMENT 'Password is saved as a 32-bytes hash, never in plain text',
`email` varchar(64) NOT NULL,
`is_deleted` int(1) unsigned NOT NULL default '0' COMMENT 'If equal to "1" then the profile has been deleted and will be re-used for new registrations',
`created` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of registration',
`updated` int(11) unsigned NOT NULL default '0' COMMENT 'Timestamp of profile update, e.g. change of email',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3) Напишите скрипт для смещения всех следующих записей пользователя после удаления предыдущей записи. Например. в нашем случае, когда Боб (uid = 2) решает удалить свой профиль, мы заменили бы его запись записью Криса (uid = 3), чтобы uid Криса стал равен 2 и пометил (is_deleted = '1') старая запись Криса как вакантная для новых пользователей. В этом случае мы сохраняем хронологический порядок идентификаторов UID в соответствии с временем регистрации, чтобы у старших пользователей были более низкие UID.
Пожалуйста, сообщите мне сейчас, какой путь является правильным способом обработки пробелов в полях auto_increment. Это только один пример с пользователями, но в моем опыте программирования такие случаи встречаются очень часто.
Заранее спасибо!