在星型模式中具有时间维度的好处?

rol*_*ice 6 schema data-warehouse database-design star-schema

与在事实表本身中拥有时间属性相比,在星型模式中拥有时间维度有什么好处?

例如:

我有一个交易数据,其中包含每笔交易的用户信息、交易发生的国家和日期。

选项 1 如果我错了,请纠正我,但这可能是广泛使用的方法,也是许多人最推荐的方法:

  • 包含transaction_ID(PK)、user_id(FK) 和country_id(FK) 以及 date_id (FK) 的交易事实表

  • 包含user_id(PK) 和其他用户属性的用户维度,比方说name& phone_number

  • date_id(PK), date, day, month, year, , 组成的日期维度quarter

选项 2 我只是想而不是选择选项 1,但不确定:

  • 包含transaction_ID(PK), user_id (FK) 和country_id(FK), date, day, month, year, 的交易事实表quarter

  • 包含user_id(PK) 和其他用户属性的用户维度,比方说name& phone_number

选择 1选择 2有什么好处?我不知道为什么加入另一个 Date 维度会是更好的选择,即使它是最广泛使用的方法。非常感谢!

Sco*_*red 7

让我用一个从简单的事务表开始的场景来回答这个问题。当我们的业务开始时,管理层想知道月份的“名称”,因此我将这些信息包含在表格中。

DECLARE @Transactions TABLE (
    TransactionId INT
    ,UserId VARCHAR(10)
    ,CountryId INT
    ,TransactionDate DATE
    ,[MonthName] VARCHAR(20)
    ,SalesAmount DECIMAL(18, 2)
    )
Run Code Online (Sandbox Code Playgroud)

生意一直很好,我们的 Transactions 表中已经有 100 万行。事实上,生意很好,管理层现在就我们的销售提出了更深入的问题。他们想知道销售是在哪个“季度”进行的。

ALTER TABLE Transactions ADD [QuarterName] VARCHAR(10)
UPDATE Transactions SET QuarterName = ... 
Run Code Online (Sandbox Code Playgroud)

我们刚刚更新了 100 万行。

随着时间的推移,管理层开始对我们的销售提出越来越多的问题。

  • 那次销售是在什么 DayOfTheWeek 进行的?
  • 那是假期吗?
  • 那天满月吗?

ALTER TABLE Transaction ADD ...

UPDATE TABLE SET ...

希望你能看到这是怎么回事。此外,每个事务行上的所有冗余数据都会降低性能并增加资源利用率(内存、磁盘空间等)。我们的数据库更大,需要更长的时间来备份。所有冗余数据都占用内存。

使用日期维度表,所有这些信息都存储在一个地方。日期从 2000-01-01 到 2100-01-01 的日期维度表仅包含 36525 行。任何时候我们想要跟踪日期的新属性,我们只需要通过添加附加属性来更改该表并更新 36525 行。

当我们想要关于销售的“日期”属性的特定信息时,我们只需结合日期维度表

此外,日期维度中的数据是一致的。 January拼写正确,Saturday拼写正确等。 将此类数据存储在事务表中会导致各种拼写错误等差异。

有关创建日期维度表的详细信息,请查看 在 SQL Server 中创建日期维度或日历表