Mysql 多聚合级别的数据建模

Mysql 多聚合级别的数据建模,mysql,database,postgresql,data-modeling,Mysql,Database,Postgresql,Data Modeling,我有一个关于数据建模的问题 我有一个名为“sales”的表,其中存储了不同级别的客户销售汇总。它具有以下属性: id (integer) period_id (integer) customer_id (integer) product_category_id (integer) channel_id (integer) value (float) sales_id (integer) and a bunch of numerical statistical values 根据填充的“id”

我有一个关于数据建模的问题

我有一个名为“sales”的表,其中存储了不同级别的客户销售汇总。它具有以下属性:

id (integer)
period_id (integer)
customer_id (integer)
product_category_id (integer)
channel_id (integer)
value (float)
sales_id (integer)
and a bunch of numerical statistical values
根据填充的“id”属性,我知道聚合的级别。例如:

如果期间id、客户id和产品类别id已填充,但通道id为空,则我知道它由所有通道聚合。如果product_category_id也是空的,我知道它是由所有渠道和产品类别聚合的

与该销售表的每一行相关联,我在performance_analysis table中有一个关联行,用于存储这些销售的统计分析。此表具有以下属性:

id (integer)
period_id (integer)
customer_id (integer)
product_category_id (integer)
channel_id (integer)
value (float)
sales_id (integer)
and a bunch of numerical statistical values
我认为在sames(sales)表中存储这些不同级别的聚合不是一个好的做法,我计划做一些更改。我的想法是只对最分类的级别进行评分,并使用SQL进行聚合,动态地获得每个级别的聚合。在这种情况下,“sales”表的所有references属性都将被填充,我将根据需要进行分组和求和

问题是:通过这样做,我失去了与性能分析表的1x1关联。然后,我必须将引用属性移动到分析表中,问题仍然存在

我仍然需要使用空属性黑客来知道聚合的级别

重要的是要注意,聚合分析数据并不是微不足道的。我不能简单地求和属性,它们是特定于分析值的。因此,这不是“销售”案例中的重复数据。但它在同一张表上仍然有不同级别的“聚合”


存储这些数据的最佳方式是什么?

就以最细粒度保存销售数据而言,您的做法肯定是正确的。你所描述的非常像一个维度模型的事实表,拉尔夫·金博尔(维度建模的关键人物)总是建议你将度量值保持在尽可能低的粒度。如果您还不熟悉尺寸建模,我建议您对其进行一些阅读,因为您正在以非常相似的方式工作,可能会找到一些有用的信息,无论是对于这个特定问题,还是对于您需要做出的其他设计决策

就您的统计值而言,维度建模规则也会告诉您,您无法将不同粒度的度量值存储在同一个表中。如果您确实无法动态计算它们,那么在每个聚合级别上创建单独的表,并为每个级别包含适当的ID列

研究多维工具(OLAP多维数据集等)可能是值得的,因为您可能不需要执行这些计算,然后将它们存储在数据库中,而是可以添加一个层,允许在运行时执行这些(以及更多)计算。对于某些用例,这比仅限于那些在设计时定义的计算有明显的好处。它们显然适合您正在创建的维度数据结构之上