Table 多粒度数据设计

Table Design for Data with multiple Granularity

我一直在努力理解数据建模和仓储,考虑到在 table 中只有一种粒度的最佳实践,我可以 table 存储低粒度数据吗?汇总数据。

2 Table 结构

Table 1

TransactionID   Transaction_Dt  ProductID   Items   Cost_Total
11111           1/1/2020        1           10      100
11111           1/1/2020        2           5       200
11111           1/1/2020        3           4       400
11111           1/1/2020        4           5       100
11111           1/1/2020        5           6       600
11111           1/1/2020        6           10      100

Table 2(汇总)

TransactionID   Transaction_Dt  Total_Items Cost_Total
11111           1/1/2020        40          1500

一个table结构

汇总 table

中的数据
TransactionID   Transaction_Dt  ProductID   Items   Cost_Total  Type
11111           1/1/2020        1           10      100         ind_Item
11111           1/1/2020        2           5       200         ind_Item
11111           1/1/2020        3           4       400         ind_Item
11111           1/1/2020        4           5       100         ind_Item
11111           1/1/2020        5           6       600         ind_Item
11111           1/1/2020        6           10      100         ind_Item
**11111         1/1/2020        ALL         40      1500        all_Item**

这里我们有一个记录,包含所有项目的总和和所有成本的总和。

谁能帮我解决第二种方法的缺点,我们在同一个 table

中聚合数据

对此的一些想法:

  1. 我不喜欢将多个聚合级别的数据存储在一个 table 中,原因是@Marmite Bomber 建议 - 如果你做一个 select 总和而不过滤掉聚合,你会得到你正在寻找的答案的倍数。
  2. 如果您仍然想将所有内容都放在一个 table 中,我会添加另一列,可能称为 agg_level,并指出该行的聚合级别 table ]. (尽管类型是一个非常模糊的术语,但您已经在 'Type' 列中这样做了)。
  3. 我建议不要更改 TransactionID 值(您建议添加一些星号以表明它是一个聚合)。修改它会使搜索你想要的变得更加困难,用户将不得不理解你的符号才能获得正确的记录。如果您确实添加了 agg_level 列并保留原始形式的 TransactionID,则可以在 agg_level 列中放置一个易于识别的术语。例如,记录可以是“原始”、“交易总额”或“月度汇总”...
  4. 如果您必须将聚合放入基础数据 table,如您所示,您应该考虑在 table 之上创建视图,每个视图仅提供一个细节聚集水平。您可能只允许用户访问这些视图,而不是基础数据。通过这种方式,您可以将每个人都存储在一个 table 中,但是对于用户来说,看起来您有多个 table 并且您不必担心用户不小心误导了带回重复总计的查询。

这是一个很好的问题,Snehasish,它表明您一直在思考。祝您在满足未来需求时好运!