我需要存储产品及其价格和数量(以及许多其他内容)并跟踪历史记录。
现在,鉴于价格和数量都存储为整数,我的理解是这些都是事实衡量标准。所以我们可能有一个像这样的表:
f_products:
id
sku
price
quantity
由于价格随时间变化,我们可以插入一个新的事实,我可以在表中引入有效日期,以便查询给定时间的价格或数量。
但在这种设计中,如果数量发生变化,我必须插入另一行,再次重复不变的价格值。虽然这对于 2 列来说还不错,但实际上我有 10 列。
所以,我的设计是:
f_products:
id
sku
price:
id
product_id
price
start_date
end_date
another "dimension":
id
product_id
value
start_date
end_date
and so on
现在,当价格发生变化时,“事实”不再需要改变,我可以查询这些表中的历史值。
所以我的问题是,这似乎不符合标准的事实/维度设计,所以我想知道更有经验的建模师会如何处理这些要求。
老实说,这真的取决于你的用例,但对我来说,我可能只是将所有 10 列存储在同一个表中并称之为一天(除非它们彼此非常不相关,那么我可能会对其进行规范化)。拥有完整的字段列表可能会影响不同的答案,您的方法也是有效的。保持这种方式可能需要更多的工作。
本质上它将是一个事务表,并为任何字段的每次更改记录一条记录。然后最容易查看给定产品的当前状态是什么,或者它在给定时间范围内的状态是什么。
是的,您会遇到一些数据重复,但大多数现代数据库系统无论如何都会自动压缩它们的表。因此,除非您认为您将每天创建数十亿笔交易并开始涉足大数据领域,否则从性能的角度来看,我不会非常担心。