在有些情況下,為了保持歷史的一些狀態(tài),需要用拉鏈表來做,這樣做目的在可以保留所有狀態(tài)的情況下可以節(jié)省空間。
目前創(chuàng)新互聯(lián)公司已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、廣南網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
拉鏈表適用于以下幾種情況吧
數(shù)據(jù)量有點(diǎn)大,表中某些字段有變化,但是呢變化的頻率也不是很高,業(yè)務(wù)需求呢又需要統(tǒng)計(jì)這種變化狀態(tài),每天全量一份呢,有點(diǎn)不太現(xiàn)實(shí),
不僅浪費(fèi)了存儲空間,有時(shí)可能業(yè)務(wù)統(tǒng)計(jì)也有點(diǎn)麻煩,這時(shí),拉鏈表的作用就提現(xiàn)出來了,既節(jié)省空間,又滿足了需求。
一般在數(shù)倉中通過增加begin_date,en_date來表示,如下例,后兩列是start_date和end_date.
1 2 3 4 5 6 7 8 9 10 | 1 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 2016-08-20 1 2016-08-20 2016-08-21 支付 2016-08-21 2016-08-21 1 2016-08-20 2016-08-22 完成 2016-08-22 9999-12-31 2 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 2016-08-20 2 2016-08-20 2016-08-21 完成 2016-08-21 9999-12-31 3 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 2016-08-21 3 2016-08-20 2016-08-22 支付 2016-08-22 9999-12-31 4 2016-08-21 2016-08-21 創(chuàng)建 2016-08-21 2016-08-21 4 2016-08-21 2016-08-22 支付 2016-08-22 9999-12-31 5 2016-08-22 2016-08-22 創(chuàng)建 2016-08-22 9999-12-31 |
begin_date表示該條記錄的生命周期開始時(shí)間,end_date表示該條記錄的生命周期結(jié)束時(shí)間;
end_date = ‘9999-12-31’表示該條記錄目前處于有效狀態(tài);
如果查詢當(dāng)前所有有效的記錄,則select * from order_his where dw_end_date = ‘9999-12-31′
如果查詢2016-08-21的歷史快照,則select * from order_his where begin_date <= ‘2016-08-21′ and end_date >= ‘2016-08-21’
再簡單介紹一下拉鏈表的更新:
假設(shè)以天為維度,以每天的最后一個(gè)狀態(tài)為當(dāng)天的最終狀態(tài)。
以一張訂單表為例,如下是原始數(shù)據(jù),每天的訂單狀態(tài)明細(xì)
1 2 3 4 5 6 7 8 9 10 | 1 2016-08-20 2016-08-20 創(chuàng)建 2 2016-08-20 2016-08-20 創(chuàng)建 3 2016-08-20 2016-08-20 創(chuàng)建 1 2016-08-20 2016-08-21 支付 2 2016-08-20 2016-08-21 完成 4 2016-08-21 2016-08-21 創(chuàng)建 1 2016-08-20 2016-08-22 完成 3 2016-08-20 2016-08-22 支付 4 2016-08-21 2016-08-22 支付 5 2016-08-22 2016-08-22 創(chuàng)建 |
根據(jù)拉鏈表我們希望得到的是
1 2 3 4 5 6 7 8 9 10 | 1 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 2016-08-20 1 2016-08-20 2016-08-21 支付 2016-08-21 2016-08-21 1 2016-08-20 2016-08-22 完成 2016-08-22 9999-12-31 2 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 2016-08-20 2 2016-08-20 2016-08-21 完成 2016-08-21 9999-12-31 3 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 2016-08-21 3 2016-08-20 2016-08-22 支付 2016-08-22 9999-12-31 4 2016-08-21 2016-08-21 創(chuàng)建 2016-08-21 2016-08-21 4 2016-08-21 2016-08-22 支付 2016-08-22 9999-12-31 5 2016-08-22 2016-08-22 創(chuàng)建 2016-08-22 9999-12-31 |
可以看出 1,2,3,4每個(gè)訂單的狀態(tài)都有,并且也能統(tǒng)計(jì)到當(dāng)前的有效狀態(tài)。