首页 > 解决方案 > 时间序列数据的星型模式多对多

问题描述

我有一个数据仓库/星型模式建模问题。

我有不同位置(尺寸)的仪表读数(事实)。每个位置都有多个不同角色的组织。我想在数据仓库模式中对此进行建模。目前的计划是:

fact_meter_readings
   timestamp,
   location_id,
   meter_reading (number)

dim_locations
   location_id
   name

dim_location_organisations
   location_id
   organisation_id
   role_id
   organisation_name
   role_name

Unique key (location_id, organisation_id, role_id)

最后一张桌子是有问题的。尽管该表具有唯一约束,但该唯一约束并未与事实表共享,这是我不清楚的一点。

我想使用此模式来回答诸如sum themeter_reading 按组织分组之类的问题,他们在其中扮演“操作员”角色

例如

select 
  lo.organisation_name,
  sum(meter_reading) 
from fact_meter_readings m
inner join dim_location_organisations lo
on lo.location_id = m.location_id
where lo.role_id = xyz
group by lo.organisation_name

由于维度表没有与事实表共享的唯一键,这里有什么问题吗?显然查询需要小心处理以避免重复计算事实。

标签: sqldata-warehousestar-schema

解决方案


我会创建一个名为组织的新表,因为位置和组织是两个不同的概念。然后可以通过位置表查询组织:

fact_meter_readings
   timestamp,
   location_id,
   meter_reading (number)

dim_locations
   location_id
   name

dim_location_organisations
   location_id
   role_id
   role_name

dim_organization
   organization_id
   location_id
   organisation_name

也许“角色”也应该有自己的维度。查询会更长一些,但我相信为每个概念赋予自己的维度会更清晰,并且会在未来得到回报


推荐阅读