2010-06-07 6 views
1

Je développe un processus ETL et j'ai besoin d'une table de pont pour une relation un-à-plusieurs entre une table de faits et une table de dimension (base de données MySQL). Il y a un nombre limité de combinaisons (quelques milliers), donc je veux réutiliser les clés de groupe de la table de bridge pour limiter la taille.Récupère la clé de groupe de la table de pont

Tout groupe de dimensions appartenant à une rangée de fait sera composé d'un certain nombre de clés de dimension (1 à environ 15), associé à une touche de groupe unique, comme ci-dessous:

group_key | dimension_key 
----------------------- 
1   | 1 
1   | 3 
1   | 4 
2   | 1 
2   | 2 
2   | 3 
3   | 1 
3   | 4 

Comment puis-je aller au sujet récupérer la clé de groupe unique pour les dimensions 1,3,4 (c'est-à-dire 1)?

+0

Pouvez-vous clarifier ce que vous demandez? – VeeArr

Répondre

1

Je pense que vous demandez une requête qui renvoie les groupes de sorte que toutes les dimensions dans une liste spécifique sont associées au groupe. C'est-à-dire que des lignes doivent exister pour mapper ce groupe sur chacune des dimensions, et vous voulez savoir quels groupes le satisfont.

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; 

L'autre solution est de compter les lignes correspondantes dans le groupe:

SELECT f.group_key 
FROM facts f 
WHERE f.dimension_key IN (1,3,4) 
GROUP BY f.group_key 
HAVING COUNT(*) = 3; 

mais je trouve que généralement GROUP BY est un tueur de performance en particulier dans MySQL.

+0

Votre première solution proposée est exactement ce que je cherche! Je vous remercie :) –

0

Si je vous comprends bien, ce que vous voulez est une table de bridge qui ressemble à ceci:

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

Vous avez 2 options que je peux voir.

Vous pouvez extraire l'ensemble de la table de pont dans un programme et déterminer par programme la clé de groupe à partir de l'ensemble de dimensions.

Vous pouvez également coder la clé de dimension à l'aide d'une formule mathématique pour obtenir un entier que vous ne pouvez pas indexer.

Quelque chose comme a + (b * 32) + (c * 32 * 32) + ... Utilisez la puissance la plus faible de 2 qui englobe le nombre de dimensions uniques.

Questions connexes