我对数据建模有疑问。
我有一个名为“sales”的表格,我存储了不同级别的客户销售汇总。它具有以下属性:
id (integer)
period_id (integer)
customer_id (integer)
product_category_id (integer)
channel_id (integer)
value (float)
根据填充的“id”属性,我知道聚合的级别。例如:
如果填充了period_id,customer_id和product_category_id,但channel_id为NULL,我知道它是由所有通道聚合的。如果product_category_id也为NULL,我知道它是由所有渠道和产品类别汇总的。
与该sales表的每一行相关联,我在performance_analysis表中有一个关联行,用于存储这些销售的统计分析。该表具有以下属性:
sales_id (integer)
and a bunch of numerical statistical values
我认为在同一个(销售)表中存储这些不同级别的聚合并不是一个好习惯,我打算做一些改变。我的想法是获得最分解的级别,并使用SQL进行聚合,即时获得每个级别的聚合。在那种情况下,“sales”表的所有引用属性都将被填充,我将根据我的需要使用GROUP BY和SUM。
问题是:通过这样做,我失去了与performance_analysis表的1x1关联。然后,我必须将引用属性移动到分析表,问题仍然存在。
我仍然必须使用NULL属性hack来知道聚合的级别。
重要的是要注意分析数据的汇总不是微不足道的。我不能简单地理解属性,它们特定于分析的值。所以这不是数据重复,因为它是在“销售”案例中。但它在同一张桌子上仍然有不同程度的“聚合”。
存储该数据的最佳方法是什么?
答案 0 :(得分:2)
就最精细的销售数据而言,你肯定是在正确的轨道上。您所描述的内容非常类似于维度模型的事实表,而Ralph Kimball(维度建模中的关键人物)总是会建议您尽可能保持最低的粒度。如果您还不熟悉维度建模,我建议您对其进行一些阅读,因为您的工作方式非常相似,可能会找到一些有用的信息,既可以针对这个特定问题,也可以针对您需要的其他设计决策制作。
就您的统计值而言,维度建模规则也会告诉您,您根本无法存储同一个表中不同粒度的度量。如果你真的无法在运行中计算它们,那么在每个聚合级别创建单独的表,并为每个级别包含适当的ID列。
可能值得研究多维工具(OLAP多维数据集等),因为有可能不是将这些计算运出然后将它们存储在数据库中,您可以添加一个允许这些的层 - 和更多 - 在运行时进行的计算。对于某些用例,这比仅限于在设计时定义的那些计算具有明显的好处。它们肯定会明显适合您正在创建的维度数据结构。