如何在不重建 table 的情况下向事实 table 添加新维度?
How do I add new dimensions to a fact table without having to rebuild the table?
我是数据仓库的新手,所以很抱歉,如果这是非常基础的,但我对这个概念很好奇。
示例:假设我有一个 table 存储网站的汇总分析(例如,给定日期 url 的总网页浏览量)。
dbo.PageFacts
Date
Url_Id
Page_Views
2020-01-01
1
280
2020-01-01
2
50
2020-01-02
3
10
现在假设我的任务是向这个 table 添加一个新的“Device_Id”列(外键到它自己的维度 table),现在 table是这样拆分出来的...
Date
Url_Id
Device_Id
Page_Views
2020-01-01
1
101
180
2020-01-01
1
102
100
2020-01-01
2
101
50
2020-01-02
3
101
10
对于拥有数百万条记录的事实 table,大多数人如何着手这样做?我假设您不想在每次添加新维度时都重建它,尤其是当它需要更新聚合值时。
我正在考虑根据事实 table 创建一个代理键,然后创建一个单独的维度 table,其中包含细分百分比(例如 0.75、0.25 等),然后构建一个 VIEW将它们连接在一起并计算新值?像这样...
CREATE TABLE PageFacts (
PageSurKey INT PRIMARY KEY,
Date DATE,
Url_Id INT,
Page_Views INT
);
CREATE TABLE Device_Pct (
Id INT PRIMARY KEY,
PageSurKey INT FOREIGN KEY REFERENCES PageFacts(PageSurKey),
Device_Id INT,
Percentage FLOAT
);
CREATE VIEW Device_PageFacts AS
SELECT
pf.Date,
pf.Url_Id,
d.Device_Id,
SUM(pf.Page_Views * d.Percentage) as Page_Views
FROM PageFacts pf
JOIN Device_Pct d on d.PageSurkey = pf.PageSurkey
GROUP BY pf.Date, pf.Url_Id, d.Device_Id;
这似乎是可行的方法(因为添加新的维度进一步分割数据只需要知道分割的比率),但我不知道是否有更好的做法。任何见解都会有所帮助。提前致谢。
通常情况下,如果更改粒度,您将重建事实 table。这是对维度模型的一个非常重要的设计更改,我认为使模式复杂化以避免重建事实有任何好处 table.
如果你愿意,你可以将其作为一个附加事实table介绍,但它不会有“百分比”只是一个正常的事实table:
CREATE TABLE PageDeviceFacts
(
Date DATE references DimDate,
Url_Id INT references DimUrl,
Device_ID INT references DimDevice,
Page_Views INT,
constraint pk_PageDeviceFacts
primary key (Date,Url_Id,Device_ID)
);
如果它很大 table,请将 PK 设为非聚集并创建聚集列存储索引
create clustered columnstore index cci_PageDeviceFacts on PageDeviceFacts
并且旧的 PageFacts table 成为模型中的聚合事实。
我是数据仓库的新手,所以很抱歉,如果这是非常基础的,但我对这个概念很好奇。
示例:假设我有一个 table 存储网站的汇总分析(例如,给定日期 url 的总网页浏览量)。
dbo.PageFacts
Date | Url_Id | Page_Views |
---|---|---|
2020-01-01 | 1 | 280 |
2020-01-01 | 2 | 50 |
2020-01-02 | 3 | 10 |
现在假设我的任务是向这个 table 添加一个新的“Device_Id”列(外键到它自己的维度 table),现在 table是这样拆分出来的...
Date | Url_Id | Device_Id | Page_Views |
---|---|---|---|
2020-01-01 | 1 | 101 | 180 |
2020-01-01 | 1 | 102 | 100 |
2020-01-01 | 2 | 101 | 50 |
2020-01-02 | 3 | 101 | 10 |
对于拥有数百万条记录的事实 table,大多数人如何着手这样做?我假设您不想在每次添加新维度时都重建它,尤其是当它需要更新聚合值时。
我正在考虑根据事实 table 创建一个代理键,然后创建一个单独的维度 table,其中包含细分百分比(例如 0.75、0.25 等),然后构建一个 VIEW将它们连接在一起并计算新值?像这样...
CREATE TABLE PageFacts (
PageSurKey INT PRIMARY KEY,
Date DATE,
Url_Id INT,
Page_Views INT
);
CREATE TABLE Device_Pct (
Id INT PRIMARY KEY,
PageSurKey INT FOREIGN KEY REFERENCES PageFacts(PageSurKey),
Device_Id INT,
Percentage FLOAT
);
CREATE VIEW Device_PageFacts AS
SELECT
pf.Date,
pf.Url_Id,
d.Device_Id,
SUM(pf.Page_Views * d.Percentage) as Page_Views
FROM PageFacts pf
JOIN Device_Pct d on d.PageSurkey = pf.PageSurkey
GROUP BY pf.Date, pf.Url_Id, d.Device_Id;
这似乎是可行的方法(因为添加新的维度进一步分割数据只需要知道分割的比率),但我不知道是否有更好的做法。任何见解都会有所帮助。提前致谢。
通常情况下,如果更改粒度,您将重建事实 table。这是对维度模型的一个非常重要的设计更改,我认为使模式复杂化以避免重建事实有任何好处 table.
如果你愿意,你可以将其作为一个附加事实table介绍,但它不会有“百分比”只是一个正常的事实table:
CREATE TABLE PageDeviceFacts
(
Date DATE references DimDate,
Url_Id INT references DimUrl,
Device_ID INT references DimDevice,
Page_Views INT,
constraint pk_PageDeviceFacts
primary key (Date,Url_Id,Device_ID)
);
如果它很大 table,请将 PK 设为非聚集并创建聚集列存储索引
create clustered columnstore index cci_PageDeviceFacts on PageDeviceFacts
并且旧的 PageFacts table 成为模型中的聚合事实。