1

Comment remplir Dim_tbls à partir d'une source relationnelle?Logique derrière les tables de dimension de chargement

Ces tables sont donnés:

tbl_sales: id_sales, fk_id_customer, fk_id_product, country, timestamp 
tbl_customer: id_customer, name, adress, zip, city 
tbl_product: id_product, price, product 

Mon but est d'obtenir ces attributs dans une start-schéma. Le problème que j'ai est la logique derrière le chargement des tables de dimension. Je veux dire, quelles données chargerais-je dans le Dim_Product? Tous les produits qui sont dans tbl_product? Mais comment pourrais-je savoir combien de ventes sont faites avec un produit spécifique?

Analyse Je voudrais faire sont:

How many people bought product x. 
How many sales are made from city x. 
How many sales were made between Time x and y. 

données Exemple:

tbl_sales: id_sales | fk_id_customer | fk_id_product | country | timestamp 
       1 |  2  |  1  | UK | 19.11.2013 10:23:22 
       2 |  1  |  2  | FR | 20.11.2013 06:04:22 

tbl_customer: id_customer | name | adress | zip | city 
         1 | Frank|Street X| 211 | London 
         2 | Steve|Street Y| 431 | Paris 

tbl_customer: id_product| Price | product 
         1 | 100,00| Hammer 
         2 | 50,00| Saw 
+0

oui. Comme je l'ai dit, ce n'est qu'un exemple. – user2428207

Répondre

2

Commençons par un modèle de schéma en étoile très simple; Par exemple, je suppose que vous n'avez pas besoin de vous soucier de la gestion des modifications apportées aux attributs des dimensions.

factSales

DateKey 
    CustomerKey 
    ProductKey 
    Counter (=1; this is a factless fact table) 

DimDate

DateKey 
    Date 
    Year 
    Quarter 
    Month 
    ... 

DimCustomer

CustomerKey 
    Name 
    Address 
    Zip 
    City 

DimProduct

ProductKey 
    Name 
    Price (if it changes, you need move it to factSales) 

Combien de personnes ont acheté ce produit? X.

SELECT DISTINCT CustomerKey 
FROM factSales 
WHERE ProductKey IN (SELECT ProductKey 
         FROM dimProduct 
         WHERE Name = 'Product X') 

Combien de ventes sont faites de la ville x.

SELECT SUM(Counter) 
FROM factSales 
WHERE CustomerKey IN (SELECT CustomerKey 
         FROM dimCustomer 
         WHERE City = 'City X') 

Combien de ventes ont été faites entre temps x et y.

SELECT SUM(Counter) 
FROM factSales 
WHERE DateKey IN (SELECT DateKey 
        FROM dimDate 
        WHERE Date BETWEEN DateX AND DateY) 
+0

Très bien, jusqu'à présent, je le comprends. Mais comment puis-je charger les tables à partir de mon exemple ci-dessus (voir la fin de la publication éditée). Je ne comprends pas comment nous divisons les données dans les tables dim/fact. Par exemple la date .. ok je suis daté dans la table Dim maintenant mais comment le schéma sait-il quand la vente a été faite? Et BTW: dans mon modèle de données aucune donnée ne va être changé à l'avenir. – user2428207

+1

La table de faits contient une référence à 'dimDate' (colonne' DateKey'), vous devez donc joindre ces deux tables pour déterminer la date de vente. Votre exemple est assez simple, il y a donc un mappage 1: 1 des tables transactionnelles et dimensionnelles + 'dimDate' qui devrait être prérempli avec toutes les dates de la période qui vous intéresse. Vous commencez par les dimensions - chargez les attributs à partir de vos tables (y compris les clés naturelles) et générer des clés de substitution ('CustomerKey',' ProductKey', etc). Puis chargez la table de faits - utilisez les recherches pour obtenir les clés appropriées des dimensions. –

+0

Je recommande fortement le livre [The Definitive Guide to Dimensional Modeling] (http://www.amazon.com/The-Data-Warehouse-Toolkit-Dimensional/dp/1118530802) ou au moins les [techniques de modélisation dimensionnelle de base] (http: //www.kimballgroup.com/data-entrepôt-business-intelligence-ressources/kimball-techniques/dimensions-modélisation-techniques /). –

Questions connexes