Привет, есть 2 таблицы, упрощу для примера:
1. setting:
id | name
2. setting_value:
id | setting_id | domain_id | language_id | value
domain_id (если null - то настройка для общая для всех сайтов)
language_id (если null - то настройка для всех языков)
Нужно чтобы для каждого домена и языка была настройка, а если она не заполнена, то возвращалась "стандартная"
И тут вот проблема и большой вопрос, как лучше сделать:
1 (как сделано сейчас):
получаю сложным на мой взгляд вопросом, с такой логикой:
Получаем данные для текущего домена (32) и языка (15).
UNION
Получаем данные для текущего домена (32) стандартного языка (1), исключая setting_id полученные из прошлого запроса.
UNION
Получаем данные для текущего домена (32) и общего языка (null), исключая прошлые запросы
UNION
Получаем данные для стандартного домена (1) и текущего языка (15), исключая прошлые запросы
И т.д пока не переберем все варианты
2. Просто наплодить копии, чтобы для каждого языка, каждой настройки - существовала запись и получать ее по текущим параметрам запросом:
SELECT * FROM `setting_value` WHERE `domain_id` = 32 AND `language_id` = 15
Но данные будут расти как по экспоненте.
например:
20 настроек для 100 поддоменов + 10 языков = 2000 записей в setting_value, большинство из которых будут копиями
Но тут такое дело, на чаше весов:
- Сложный запрос состоящий из 9 обьедененных запросов
- Избыточные данные
Как это организовать адекватно ?