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 维度会是更好的选择,即使它是最广泛使用的方法。非常感谢!
让我用一个从简单的事务表开始的场景来回答这个问题。当我们的业务开始时,管理层想知道月份的“名称”,因此我将这些信息包含在表格中。
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 中创建日期维度或日历表