Я не уверен, что это действительно подходит к вашему вопросу, но я подумал, что это было интересное небольшое упражнение с базой данных. Предположим, у вас есть таблица с названием «настройка», как вы предлагаете в # 1:
+------------+--------------+-----------+---------------+
| setting_id | setting_name | is_system | setting_value |
+------------+--------------+-----------+---------------+
| 3 | foo | 1 | Blue |
| 4 | foo | 0 | Red |
| 5 | bar | 1 | Green |
| 6 | baz | 1 | Yellow |
| 7 | baz | 0 | Orange |
| 8 | quux | 0 | Purple |
+------------+--------------+-----------+---------------+
Первичный ключ будет на setting_id
, а к столбцам setting_name
и is_system
(который является логическим) применяется уникальное ограничение.
Чтобы найти все активные в данный момент настройки (при условии, что пользовательские настройки переопределяют системные настройки), следующий запрос выполнит эту работу:
SELECT setting_name, setting_value
FROM setting s
WHERE is_system = (
SELECT MIN(is_system)
FROM setting si
WHERE s.setting_name = si.setting_name
);
Выполнение запроса дает такой результат:
+--------------+---------------+
| setting_name | setting_value |
+--------------+---------------+
| foo | Red |
| bar | Green |
| baz | Orange |
| quux | Purple |
+--------------+---------------+
Таким образом, если пользовательский параметр существует, он выбирается, в противном случае вместо него используется системное значение по умолчанию.
Использование функции MIN()
таким способом является своего рода извращенным способом работы с булевыми значениями, но это достаточно просто.