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