Размерное моделирование для логической фильтрации ИЛИ

Каким образом размерное моделирование отвечает требованиям фильтрации логическим ИЛИ?

Например, предположим, что размер Customer с атрибутами HomeAddressId и BillingAddressId. Оба поля указывают на измерение Address. Некоторых бизнес-пользователей интересует только домашний адрес, других - только адрес для выставления счетов, но некоторые пользователи хотят отфильтровать результаты, например, по «всем клиентам с выставлением счетов или домашним адресом в Техасе».

Другой пример: измерение «Контакт» может иметь атрибуты Email1 и Email2, но фильтрация почти всегда будет выполняться по обоим полям, а не по одному или другому.


person Justin Grant    schedule 20.01.2014    source источник


Ответы (1)


Подход на основе псевдонима

В этом подходе таблица измерений Address будет иметь псевдонимы HomeAddress и BillAddress, а ID из обеих этих двух таблиц будут связаны со столбцами HomeAddressId и BillingAddressId таблицы Customer соответственно. В этом шаблоне проектирования, когда вы задаете такой вопрос,

всем клиентам с выставлением счетов или домашним адресом в Техасе

Это будет преобразовано в такой запрос:

SELECT Customer.*
FROM Customer
LEFT OUTER JOIN Address HomeAddress ON Customer.HomeAddressId    = HomeAddress.Id
LEFT OUTER JOIN Address BillAddress ON Customer.BillingAddressId = BillAddress.Id
WHERE HomeAddress.Name = 'Texas' OR BillAddress.Name = 'Texas'

В идеале псевдонимы будут определены на уровне отчетов (например, Universe в SAP Business Objects) или уровне запроса.

Подход к таблице мостов

В этом подходе вы создадите новую таблицу мостов для хранения отношения между Customer и Address в соответствии с типами. Этот подход не является «размерным» подходом как таковой, но может использоваться в многомерном моделировании в форме таблицы фактов без фактов.

CustomerID   |  Type  | AddressID
-----------------------------------
1            |  Home  | 10
2            |  Home  | 20
2            |  Bill  | 30
3            |  Home  | 10
3            |  Bill  | 40

Запрос в этом подходе будет иметь форму,

SELECT DISTINCT Customer.*
FROM Customer, CustomerAddress, Address
WHERE Customer.ID  = CustomerAddress.CustomerID
AND   Address.ID   = CustomerAddress.AddressID
AND   Address.Name = 'Texas'

Этот подход более применим в случаях, когда вам нужно проанализировать отношения между клиентами, принадлежащими к одному адресу.

Не уверен, что именно это вы искали, но надеюсь, что ответ будет полезен для вашей визуализации и дизайна.

person hashbrown    schedule 21.01.2014