聊聊數(shù)據(jù)冗余
每天分享一個架構(gòu)知識
我們總是說數(shù)據(jù)庫3范式,范式其實(shí)是一種理想的實(shí)現(xiàn)方式。
然而理想很豐滿,現(xiàn)實(shí)很骨感。
我們做的互聯(lián)網(wǎng)項目,擴(kuò)展快,需求變化多,什么事情都得有個度,其實(shí)嚴(yán)格遵循范式,就會導(dǎo)致多個表。對于查詢不是很友好。
那么什么時候可以進(jìn)行數(shù)據(jù)冗余呢?
以我豐富經(jīng)驗,總結(jié)了一下幾點(diǎn),如果你有更好的點(diǎn),也可以私信評論。
1數(shù)據(jù)查詢頻繁:如果某個數(shù)據(jù)在系統(tǒng)中頻繁被查詢,而且通過聯(lián)接操作會導(dǎo)致復(fù)雜的查詢語句或性能問題,可以考慮在不同表之間進(jìn)行冗余設(shè)計,將相關(guān)數(shù)據(jù)冗余存儲到一個表中,以提高查詢性能。2數(shù)據(jù)復(fù)雜度較高:當(dāng)數(shù)據(jù)實(shí)體包含大量復(fù)雜的關(guān)聯(lián)信息或需要多表聯(lián)接才能獲取完整信息時,可以通過冗余設(shè)計將關(guān)聯(lián)信息冗余存儲到一個表中,以簡化查詢操作。3數(shù)據(jù)報表或統(tǒng)計需求:如果系統(tǒng)需要頻繁生成報表或進(jìn)行統(tǒng)計分析,并且這些操作需要訪問大量的數(shù)據(jù)和復(fù)雜的聯(lián)接操作,可以通過冗余設(shè)計將報表或統(tǒng)計所需的數(shù)據(jù)冗余存儲到一個表中,以提高生成報表和統(tǒng)計的性能。
那么這么做有什么優(yōu)點(diǎn)呢?
1提高查詢性能:通過數(shù)據(jù)冗余,可以避免復(fù)雜的聯(lián)接操作和多表查詢,減少查詢語句的復(fù)雜度,從而提高查詢性能和響應(yīng)速度。2簡化系統(tǒng)設(shè)計:數(shù)據(jù)冗余可以簡化系統(tǒng)設(shè)計和查詢邏輯,減少開發(fā)復(fù)雜度和維護(hù)成本。3支持報表和統(tǒng)計:通過冗余設(shè)計,可以提前計算和存儲報表和統(tǒng)計所需的數(shù)據(jù),從而加快報表和統(tǒng)計的生成速度。
那么如何實(shí)現(xiàn)表的冗余設(shè)計呢?
1冗余列:在一個表中添加冗余列,將其他表中的數(shù)據(jù)冗余存儲到該列中,以避免聯(lián)接操作。2冗余表:創(chuàng)建一個新的表,將相關(guān)的數(shù)據(jù)冗余存儲到該表中,以簡化查詢操作。3數(shù)據(jù)同步:通過觸發(fā)器、定時任務(wù)或其他機(jī)制,將數(shù)據(jù)從源表同步到目標(biāo)表中,以提供冗余備份和查詢性能的優(yōu)化。canal 同步到nosql 大寬表
在實(shí)施數(shù)據(jù)冗余設(shè)計時,需要注意數(shù)據(jù)一致性和更新維護(hù)的問題。由于數(shù)據(jù)冗余會導(dǎo)致數(shù)據(jù)的冗余存儲和更新的復(fù)雜性,需要確保對冗余數(shù)據(jù)的維護(hù)和同步機(jī)制的正確性,以避免數(shù)據(jù)不一致的問題。同時,也需要權(quán)衡冗余設(shè)計帶來的存儲成本和維護(hù)復(fù)雜性,并根據(jù)具體的系統(tǒng)需求和性能要求選擇適合的實(shí)現(xiàn)方式。
最后一個問題
在實(shí)施數(shù)據(jù)冗余設(shè)計時,保持?jǐn)?shù)據(jù)一致性的方式有那些?
事務(wù)管理:使用數(shù)據(jù)庫事務(wù)來確保在進(jìn)行數(shù)據(jù)更新或插入操作時的原子性和一致性。在涉及到冗余數(shù)據(jù)的更新操作時,確保所有相關(guān)數(shù)據(jù)的更新在同一個事務(wù)中進(jìn)行,要么全部成功,要么全部回滾。
數(shù)據(jù)同步機(jī)制:使用合適的數(shù)據(jù)同步機(jī)制來確保冗余數(shù)據(jù)的同步和一致性??梢钥紤]使用觸發(fā)器、定時任務(wù)或消息隊列等機(jī)制來監(jiān)測和同步源數(shù)據(jù)和冗余數(shù)據(jù)之間的變化。
異步更新:在更新源數(shù)據(jù)后,異步地更新冗余數(shù)據(jù)。通過使用消息隊列等異步機(jī)制,將源數(shù)據(jù)的變更事件發(fā)送到冗余數(shù)據(jù)的更新程序,以減少源數(shù)據(jù)更新操作的延遲。
定期檢查和修復(fù):定期檢查冗余數(shù)據(jù)與源數(shù)據(jù)的一致性,并進(jìn)行必要的修復(fù)操作。可以通過定期運(yùn)行校驗?zāi)_本或作業(yè)來比較源數(shù)據(jù)和冗余數(shù)據(jù)的差異,并糾正不一致的部分。
數(shù)據(jù)審計和監(jiān)控:實(shí)施數(shù)據(jù)審計和監(jiān)控機(jī)制,記錄冗余數(shù)據(jù)的變更歷史和監(jiān)控數(shù)據(jù)一致性。通過記錄和監(jiān)控,可以及時發(fā)現(xiàn)數(shù)據(jù)一致性問題并進(jìn)行處理。
數(shù)據(jù)訪問控制:限制對冗余數(shù)據(jù)的直接訪問,只允許通過指定的渠道或接口訪問冗余數(shù)據(jù)。這樣可以確保數(shù)據(jù)的一致性維護(hù)在冗余數(shù)據(jù)的更新程序中進(jìn)行。
自動化測試:實(shí)施自動化測試,包括單元測試和集成測試,用于驗證冗余數(shù)據(jù)的一致性和正確性。通過編寫和運(yùn)行測試用例,可以及時發(fā)現(xiàn)和修復(fù)冗余數(shù)據(jù)的問題。
學(xué)習(xí)架構(gòu)首先得懂的架構(gòu)設(shè)計的原則,下面是一些經(jīng)典書籍,感興趣的可以看看
《軟件架構(gòu)設(shè)計的藝術(shù)》(The Art of Software Architecture) - Stephen T. Albin 著
《軟件架構(gòu)師實(shí)踐指南》(Software Architecture for Developers) - Simon Brown 著
《軟件架構(gòu)設(shè)計模式》(Software Architecture Design Patterns in Java) - Partha Kuchana 著

本文使用 文章同步助手 同步