Предположим, что моя компания продает много товаров, например, домены, футболки и фургоны.
В моем текущем проекте звездообразной схемы хранилища данных у меня есть таблица фактов для позиций счетов-фактур со следующей (слегка упрощенной) схемой
fact_invoice_item
id | pk
invoice_item_id | id of invoice in OLTP
dim_customer_key | fk to customer dimension
dim_product_key | fk to product dimension
dim_billing_date_key | fk to date dimension
dim_due_date_key | fk to date dimension
invoice_amount | fact
item_amount | fact
dd_invoice_id | degenerate dimension to group together invoice items on the same invoice
Теперь я хотел бы начать запись метаданных вокруг этих элементов счета. Например, если домен был куплен, каким было имя домена. Если был куплен фургон, то каким был номерной знак? Если была куплена футболка, какого цвета она была? Каков наилучший способ достичь этого, в то же время (в идеале) придерживаясь схемы «звезда / созвездие»?
Текущее мышление:
Вариант 1
Имейте одну общую invoice_item_metadata
таблицу размеров с fk к ней из таблицы invoice_item
. Эта таблица измерений может хранить метаданные элемента в форме json. Или даже просто сохраните метаданные покупки в таблице фактов в форме JSON. Это усложнит ситуацию, так как мне нужно будет распаковать json, чтобы выполнить любой анализ на нем.
Вариант 2
Имейте таблицу фактов для каждого типа купленного продукта, например. fact_domain_purchase
и fact_van_purchase
. Эти таблицы фактов могут иметь собственную структуру, которая наилучшим образом соответствует метаданным продукта. Это кажется логичным, но потом я начинаю думать, что домен - это скорее SCD, поскольку он может иметь такие атрибуты, как приостановленный / активный / просроченный, которые могут изменяться со временем. Это заставляет меня думать, что у меня может быть таблица fact_domain_purchase
с таблицей fk в таблицу dim_domain
, но тогда таблица dim_domain
будет расти с той же скоростью, что и таблица fact_domain_purchase
, что нежелательно.
Есть ли у кого-нибудь яркие идеи о том, как справиться с этой ситуацией? Я уверен, что не могу быть первым, кто решит эту проблему, но мне было довольно сложно получить от Google что-нибудь полезное. Заранее спасибо за любую помощь