Логика загрузки таблиц измерений

Как заполнить Dim_tbls из реляционного источника?

Даны примеры таблиц:

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

Моя цель — включить эти атрибуты в начальную схему. Проблема, с которой я сталкиваюсь, заключается в логике загрузки таблиц измерений. Я имею в виду, какие данные я буду загружать в Dim_Product? Все продукты, которые есть в tbl_product? Но как мне узнать, сколько продаж было совершено с конкретным продуктом?

Анализ, который я хотел бы сделать, это:

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

Пример данных:

 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

person user2428207    schedule 08.10.2013    source источник
comment
да. как я уже сказал, это только пример.   -  person user2428207    schedule 08.10.2013


Ответы (1)


Давайте начнем с очень простой модели схемы звезды; например, я предположил, что вам не нужно беспокоиться об обработке изменений атрибутов измерений.

фактПродажи

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

dimDate

  DateKey
  Date
  Year
  Quarter
  Month
  ...

dimКлиент

  CustomerKey
  Name
  Address
  Zip
  City

dimProduct

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

Сколько людей купили продукт x.

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

Сколько продаж сделано в городе x.

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

Сколько продаж было совершено между временем x и y.

SELECT SUM(Counter)
FROM factSales
WHERE DateKey IN ( SELECT DateKey
                   FROM dimDate
                   WHERE Date BETWEEN DateX AND DateY )
person Marek Grzenkowicz    schedule 08.10.2013
comment
Ладно, пока я это понимаю. Но как мне загрузить таблицы из моего примера выше (см. конец отредактированного поста). Я не понимаю, как мы разделяем данные на таблицы dim/fact. Например, дату.. хорошо, теперь я получил дату в таблице Dim, но как схема узнает, когда была совершена продажа? И кстати: в моей модели данных никакие данные не будут изменены в будущем. - person user2428207; 09.10.2013
comment
Таблица фактов содержит ссылку на dimDate (столбец DateKey), поэтому вам нужно соединить эти две таблицы, чтобы определить дату продажи. Ваш пример довольно прост, поэтому имеется сопоставление 1:1 таблиц транзакций и таблиц измерений + dimDate, которое должно быть предварительно заполнено всеми датами из интересующего вас периода. Вы начинаете с измерений - загружаете атрибуты из вашего таблицы (включая естественные ключи) и генерировать суррогатные ключи (CustomerKey, ProductKey и т. д.). Затем загрузите таблицу фактов — используйте поиск, чтобы получить соответствующие ключи из измерений. - person Marek Grzenkowicz; 09.10.2013
comment
Я настоятельно рекомендую Полное руководство по многомерному моделированию книга или, по крайней мере, основной параметр методы моделирования. - person Marek Grzenkowicz; 09.10.2013