Дизайн моделирования данных - PullRequest
0 голосов
/ 07 января 2019

Я сейчас читаю книгу Кимбалла по хранилищу данных и в то же время я смотрю на проектирование хранилища данных для следующего примера:

1: Клиент может купить продукты, которые сгенерируют счет-фактуру, а затем - строку инвентаризации. Примечание. Строка инвентаря является таблицей накопления, т. Е. Если они заказывают Продукт A с количеством 5, а затем еще 5, то будет 2 строки счета и одна строка инвентаря в 10 единиц.

Таким образом, исходя из описанного сценария, будет подходящим следующий дизайн: 1. Клиентское измерение 2. Размер продукта 3. Измерение даты 3. Факт фактуры 4. Инвентарный факт

Теперь, скажем, я хочу узнать ответы на такие вопросы, как 1. Какие клиенты в настоящее время имеют нулевой запас, но сгенерировали счета за последние 3 месяца. Будут и другие подобные вопросы, подобные этим. 2. Какие клиенты имеют продукт А, но не имеют продукт Б

Судя по книге Кимбалла, кажется, что между двумя таблицами фактов должно быть какое-то соединение, например, подмножество?

Это может показаться довольно неэффективным, особенно из-за огромного размера записей между двумя таблицами фактов. Это правильный подход?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Какие клиенты в настоящее время имеют нулевой запас, но сгенерировали счета за последние 3 месяца.

SELECT C.* 
FROM DimClient C
WHERE EXISTS (
  SELECT * FROM FactInvoice I 
  WHERE C.ClientKey = I.ClientKey
  AND InvoiceDate >= DATEADD(m,GetDate(),-3)
  )
AND NOT EXISTS (
    SELECT * FROM FactInventory V 
    WHERE InventoryLevel > 0 
    AND V.ClientKey = C.ClientKey
    AND (Maybe a predicate to limit to current inventory only)
    )

Какие клиенты имеют продукт A, но не имеют продукта B

SELECT C.* 
FROM DimClient C
WHERE EXISTS (
  SELECT * FROM FactInvoice I 
  WHERE C.ClientKey = I.ClientKey
  AND I.ProductID IN (1,2,3)
  )
AND NOT EXISTS (
  SELECT * FROM FactInvoice I 
  WHERE C.ClientKey = I.ClientKey
  AND I.ProductID NOT IN (4,5,6)
  )

Эти запросы неэффективны? Не более неэффективно, чем тот же запрос, выполненный для исходной системы

Фактически вашей исходной системе, вероятно, понадобится больше таблиц, больше объединений и, вероятно, будет меньше индексов

Одной из основ звездных схем является то, что они оптимизированы для аналитики.

0 голосов
/ 07 января 2019

По словам Кимбалла, это кажется правильным подходом к строительству бурения по горизонтали . Он упоминает, что для правильной работы он должен быть настроен на использование соответствующих размеров, как определено здесь и , объясненных здесь . Я не могу говорить о том, насколько эффективно / неэффективно это будет в этом случае.

...