使用MySQL将DATE字段作为日期维度的主键

15

我想在MySQL数据仓库中处理日期维度。(我是数据仓库领域的新手)

我通过谷歌搜索发现了很多表结构(大部分为)日期维度,其中主键是一个简单的UNSIGNED INTEGER

既然在MySQL中,DATE字段仅占用3个字节,而INTEGER需要4个字节,那么为什么不使用DATE字段作为主键呢?

例如:

CREATE TABLE dimDate
id INTEGER UNSIGNED NOT NULL PRIMARY AUTOI_NCREMENT,
date DATE NOT NULL,
dayOfWeek
...

VS

CREATE TABLE dimDate
date DATE NOT NULL PRIMARY,
dayOfWeek
...

2
你不希望在同一日期有多条记录吧? - Mat
1
不,我期望我的事实表中有很多相同日期的记录,而不是维度表。 - nemenems
Kimball说每个维度pk都应该是代理键。 - Neil McGuigan
2个回答

24

日期维度是一种特殊的维度--使用日期(例如2011-12-07)或者与日期相关的整数(例如20111207)作为主键更加推荐。这样可以很好地将事实表按照日期进行分区。

对于其他类型的维度,建议使用代理键(整数)作为主键。

通常,每个维度都会有“未知、未输入、错误”等条目,并且这些通常与键 “0,-1,-2” 等相匹配。

因此,常见的情况是使用整数格式的日期(例如20111207)作为主键,而不是使用日期类型的主键--使用日期类型的主键表示“未知、未输入、错误”等内容会有一点混乱。


14
如果您有一张表,其中某一列是date类型,且没有两行记录的日期相同,那么您可以将此列作为PRIMARY KEY
通常我们会看到很多示例中主键是一个简单的UNSIGNED INTEGER,因为很多情况下并没有完美的候选主键。而设置AUTO_INCREMENT属性可以使该列在插入时自动填充(并保证其唯一性)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接