Мой подход к этой проблеме состоит в том, чтобы создать таблицу, которая представляет собой отдельный столбец для каждой переменной конфигурации, как и в случае с любым другим набором данных, и установить первичный ключ таким образом, чтобы таблица не могла содержать более одна запись. Я делаю это, устанавливая первичный ключ как перечисление только с одним допустимым значением, например так:
CREATE TABLE IF NOT EXISTS `global_config` (
`row_limiter` enum('onlyOneRowAllowed') NOT NULL DEFAULT 'onlyOneRowAllowed',#only one possible value
`someconfigvar` int(10) UNSIGNED NOT NULL DEFAULT 0,
`someotherconfigvar` varchar(32) DEFAULT 'whatever',
PRIMARY KEY(`row_limiter`)#primary key on a field which only allows one possible value
) ENGINE = InnoDB;
INSERT IGNORE INTO `global_config` () VALUES ();#to ensure our one row exists
Как только вы выполните эту настройку, любое из значений можно затем изменить с помощью простого оператора UPDATE, найти с помощью простого оператора SELECT, объединить с другими таблицами для использования в более сложных запросах и т. Д.
Еще одним преимуществом этого подхода является то, что он учитывает правильные типы данных, внешние ключи и все остальные вещи, а также надлежащий дизайн базы данных для обеспечения целостности базы данных. (Просто убедитесь, что ваши внешние ключи включены при удалении SET NULL или при удалении RESTRICT, а не при удалении CASCADE). Например, предположим, что одна из ваших переменных конфигурации - это идентификатор пользователя основного администратора сайта, вы можете расширить пример следующим образом:
CREATE TABLE IF NOT EXISTS `global_config` (
`row_limiter` enum('onlyOneRowAllowed') NOT NULL DEFAULT 'onlyOneRowAllowed',
`someconfigvar` int(10) UNSIGNED NOT NULL DEFAULT 0,
`someotherconfigvar` varchar(32) DEFAULT 'whatever',
`primary_admin_id` bigint(20) UNSIGNED NOT NULL,
PRIMARY KEY(`row_limiter`),
FOREIGN KEY(`primary_admin_id`) REFERENCES `users`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE = InnoDB;
INSERT IGNORE INTO `global_config` (`primary_admin_id`) VALUES (1);#assuming your DB is set up that the initial user created is also the admin
Это гарантирует, что у вас всегда будет действительная конфигурация, даже если переменная конфигурации должна ссылаться на какой-либо другой объект в базе данных.