楼主:
cpusf (冬天是需要棉被的)
2021-01-19 17:29:53各位先进们好
我手边有一个数据库, 资料的层级比较多, 切成数个表单1对多的关系
比如
Tier1: ~700 rows
Tier2: Tier1 per row x 800 ~ 560k rows
Tier3-1,3-2,3-3: Tier2 per row x 20 ~ 各自1.1M rows
平常探勘资料是着重在 Tier1大约取5~8个rows, 再往下join, 拉出资料进行探勘
其中
Tier3-1的表大致有1个字段会变动, 其它8个字段有相依
Tier3-2的表有2个字段会变动, 其它4个字段有相依
Tier3-3的表只有1个字段, 但是周期性重复, 也就是内容是有限的集合
我在考虑是不是做了正规化会让整个储存的效率变好
但是有几个问题查了资料之后还是没有解决, 还请先进们帮忙解惑
这个资料平台的资料是从binary的档案stream来的
CaseA.
如果要正规化, 是stream的时候就要先做正规化吗?
但streaming的过程中,
资料一卡车来的时候并不知道原先数据库有哪些已存在的项目
比如说Tier3-3
使用了composition key(含Tier1, Tier2的index)以方便data slicing,
从Mega rows中要找出数千行有关的资料效率还不错.
单一个资料字段可能出现log1, log2, log3,..... log10 (都是很长的log)
写成下面的样子
rowN index1, index2, log1
rowN+1 index1, index2, log2
原表正规化为
rowN index1, index2, result1
rowN+1 index1, index2, result2
产生一个新表
result1 log1
result2 log2
data streaming的过程中可能会出现新的log11, log12...等等
不常见但随时间推进有可能发生
有几个做法:
1. data streaming的程式不要动, 按照原样倒进Tier3-3的表
然后把Tier3-3正规化做成 Tier3-3-1(原表正规化), 与Tier3-3-2(新表记log)
再把Tier3-3清空
Tier3-3就改为新进资料的暂存区
2. data streaming的程式也要动,
程式必需要参照已有的Tier3-3-2内容, 把新加入的资料拆表之后,
再各自汇入Tier3-3-1与Tier3-3-2
(这样每次汇入都会有几千行的log, 都要进行比对不是也很耗时吗?)
实务上的正规化是做在资料汇入之前, 还是汇入之后才做二次清洗呢?
这个binary的data其实有4个层级,
index的工作都是stream时加上去的
如果正规化也要做在stream里, import的工作似乎就太复杂了
要做index, 还要跟现存的资料进行比对,
把新型态的资料补充进去, 再移除相关的column
原本方式是: stream data -> DB connection -> append
新的方式是:
DB connection -> get Tier3-3-2