[問題] 正規化的時機點

作者: 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
作者: paranoia5201 (邁向研究生)   2021-01-19 21:51:00
存成 json,不要攤平,需要時再抽取必要資料就好。
作者: cpusf (冬天是需要棉被的)   2021-01-20 09:19:00
資料的架構用json處理是蠻合適的,只是不曉得多段抽取的效能再做aggregation跟原先比起來如何..做成json也就不用考慮正規化了 (data可能有60%的重覆性大多數的變異只有在紀錄單一個樣本的特徵值(Tier3的單col)

Links booklink

Contact Us: admin [ a t ] ucptt.com