Получить ключ группы из таблицы моста
Я разрабатываю процесс ETL, и мне нужна таблица моста для отношения один ко многим между таблицей фактов и таблицей измерений (база данных MySQL). Количество комбинаций ограничено (несколько тысяч), поэтому я хочу повторно использовать групповые ключи из таблицы мостов, чтобы ограничить размер.
Любая группа измерений, принадлежащая строке фактов, будет состоять из нескольких ключей измерений (от 1 до 15), назначенных уникальному ключу группы, как показано ниже:
group_key | dimension_key
-----------------------
1 | 1
1 | 3
1 | 4
2 | 1
2 | 2
2 | 3
3 | 1
3 | 4
Как мне получить уникальный ключ группы для измерений 1,3,4 (т.е. 1)?
2 ответа
Я думаю, что вы запрашиваете запрос, который возвращает группы так, что все измерения в определенном списке связаны с группой. То есть должны существовать строки, сопоставляющие эту группу каждому измерению, и вы хотите знать, какие группы удовлетворяют этому.
SELECT f1.group_key
FROM facts f1
JOIN facts f2 ON (f1.group_key = f2.group_key)
JOIN facts f2 ON (f1.group_key = f2.group_key)
WHERE f1.dimension_key = 1
AND f2.dimension_key = 3
AND f3.dimension_key = 4;
Другое решение заключается в подсчете совпадающих строк в группе:
SELECT f.group_key
FROM facts f
WHERE f.dimension_key IN (1,3,4)
GROUP BY f.group_key
HAVING COUNT(*) = 3;
Но я нахожу это обычно GROUP BY
является убийцей производительности, особенно в MySQL.
Если я вас правильно понимаю, вам нужна таблица-мост, которая выглядит следующим образом:
group_key | dimension_set
-----------------------
1 | (1, 3, 4)
2 | (1, 2, 3)
3 | (1, 4)
У вас есть 2 варианта, которые я вижу.
Вы можете вытащить всю таблицу мостов в программу и программно определить ключ группы из набора измерений.
Или вы можете закодировать ключ измерения, используя математическую формулу, чтобы получить целое число, которое вы не можете индексировать.
Что-то вроде a + (b * 32) + (c * 32 * 32) + ...
Используйте самую низкую степень 2, которая включает в себя количество уникальных измерений.