sql - 时间序列数据的星型模式多对多
问题描述
我有一个数据仓库/星型模式建模问题。
我有不同位置(尺寸)的仪表读数(事实)。每个位置都有多个不同角色的组织。我想在数据仓库模式中对此进行建模。目前的计划是:
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
由于维度表没有与事实表共享的唯一键,这里有什么问题吗?显然查询需要小心处理以避免重复计算事实。
解决方案
我会创建一个名为组织的新表,因为位置和组织是两个不同的概念。然后可以通过位置表查询组织:
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
也许“角色”也应该有自己的维度。查询会更长一些,但我相信为每个概念赋予自己的维度会更清晰,并且会在未来得到回报
推荐阅读
- sql - 多个选择语句不起作用但单独会(循环和大小写)
- javascript - InertiaJS 在验证错误后保留表单数据
- javascript - paytm_allinone_react-native 支付在生产模式下失败
- mysql - GROUP BY 并选择具有两列条件的最大 ID
- javascript - Javascript:替换多行字符串中第 n 次出现的子字符串
- javascript - 我想将用户输入的值存储在某个变量中并在另一个函数中使用,或者想对用户输入数据进行一些操作
- skywalking - Apache SkyWalking,Zipkin 接收器未激活
- mysql - 在保留表中的所有数据的同时基于不同的 ID 计算平均值?
- google-chrome - Chrome 忽略云前端的缓存控制
- git - eclipse 未检测到未暂存的更改