如何在不重建 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 成为模型中的聚合事实。