Сохранение данных в виде массива или отдельных полей (php/MySQL)

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

У меня есть следующие настройки:

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

и более.

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

Это хорошая идея?

Ответ 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 все записи, которые ссылаются на идентификатор удаленной строки, также будут удалены.

Ответ 2

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