Ответ 1
Вы можете создать вспомогательную таблицу для сохранения ссылок на имена свойств. Затем вы можете связать эту таблицу с таблицей слияния — между идентификатором пользователя и идентификатором одного из свойств. При этом вы всегда можете изменить свойства.
Используя внешние ключи, вы также можете "просмотреть данные каскада", которые уже имеют свойство, которое больше не существует. Кроме того, вы можете обеспечить добавление только ссылок на допустимые имена свойств и оптимизировать поиск с помощью индексов.
Скажем, что:
CREATE TABLE user_preferences_headers
(
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL
);
CREATE TABLE `users`
(
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`pass` VARCHAR(255) NOT NULL
);
CREATE TABLE `user_preferences`
(
`id_user` INT NOT NULL,
`id_preference_entity` INT NOT NULL,
`value` VARCHAR(255)
);
ALTER TABLE `user_preferences` ADD INDEX ( `id_user` );
ALTER TABLE `user_preferences` ADD INDEX ( `id_preference_entity` );
ALTER TABLE `user_preferences` ADD FOREIGN KEY ( `id_user` ) REFERENCES `users` (
`id`
) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `user_preferences` ADD FOREIGN KEY ( `id_preference_entity` ) REFERENCES `user_preferences_headers` (
`id`
) ON DELETE CASCADE ON UPDATE CASCADE ;
Теперь вы сначала выбираете все заголовки из user_preferences_headers
по имени или нет, и вы используете идентификатор, чтобы выбрать желаемое значение привилегии пользователя (идентифицированное также идентификатором) из user_preferences
. Обратите внимание, что при удалении записи в user_preferences_headers
все записи, которые ссылаются на идентификатор удаленной строки, также будут удалены.