Получить ключ группы из таблицы моста - PullRequest
1 голос
/ 07 июня 2010

Я разрабатываю процесс 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 ]

1 голос
/ 07 июня 2010

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

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.

0 голосов
/ 07 июня 2010

Если я правильно вас понимаю, вам нужна таблица моста, которая выглядит следующим образом:

group_key | dimension_set
-----------------------
1         | (1, 3, 4)
2         | (1, 2, 3)
3         | (1, 4)

У меня есть 2 варианта, которые я вижу.

Вы можете вытащить всю таблицу мостов в программу и программно определить ключ группы из набора измерений.

Или вы можете закодировать ключ измерения с помощью математической формулы, чтобы получить целое число, которое вы не можете индексировать.

Что-то вроде a + (b * 32) + (c * 32 * 32) + ... Используйте наименьшую степень 2, которая охватывает число уникальных измерений.

...