作者cpusf (冬天是需要棉被的)
看板Database
标题[问题] 正规化的时机点
时间Tue Jan 19 17:29:53 2021
各位先进们好
我手边有一个资料库, 资料的层级比较多, 切成数个表单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 --> stream data --> compare
--> normalize --> append
还是资料已经有大略的架构, 能倒进去就倒进去, 正规化是有API在帮忙处理的?
我目前是使用sqlite3在做小规模的资料分析, 资料库大概70GB左右
觉得最麻烦的就是Tier1对应到不定长度的Tier2, Tier2也有不定长度的Tier3组合.
在资料量最多的Tier3有Normalize的可能性
如果我这样的data slicing不是很好的做法. 也欢迎鞭笞指教, 感谢.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 113.196.154.3 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1611048596.A.1B1.html
1F:推 paranoia5201: 存成 json,不要摊平,需要时再抽取必要资料就好。 01/19 21:51
2F:→ cpusf: 资料的架构用json处理是蛮合适的,只是不晓得多段抽取的效能 01/20 09:19
3F:→ cpusf: 再做aggregation跟原先比起来如何.. 01/20 09:21
4F:→ cpusf: 做成json也就不用考虑正规化了 (data可能有60%的重覆性 01/20 09:22
5F:→ cpusf: 大多数的变异只有在纪录单一个样本的特徵值(Tier3的单col) 01/20 09:24