在 「軟件設計要素初探」 一文,嘗試從軟件設計的總體角度,綜合討論了軟件設計的各類要素。本文探討軟件詳細設計中的關鍵環節:存儲設計。
html
存儲設計是領域建模的設計細化,決定數據的結構以及領域對象的表達。 存儲設計一般要考慮讀寫操做的性能、容量、併發、事務、搜索。
數據庫
業務型/事務型應用一般採用關係型數據庫實現存儲設計,經過規範化範式達成數據的一致性和完整性,儘量少的冗餘。領域建模是關係型存儲設計的前置工做。併發
採用關係型數據庫進行存儲設計時,重點有:負載均衡
數據庫設計很大程度上是領域模型的表達和呈現;所以領域模型的質量決定了數據庫設計完成後是否須要作頻繁的變動;運維
儘量採用規範化的關係範式,除非有足夠理由打破範式。數據庫設計
仔細設計實體映射關係,尤爲是一對多關係時;仔細設計外鍵引用。一般是多的方引用一的方的主鍵做爲外鍵。分佈式
仔細設計字段名稱、類型。字段具備單一含義,名稱儘可能貼切而具備描述性;主鍵類型一般採用自增的 bigint;字符串儘量採用VARCHAR;枚舉採用字符串更易理解;日期採用Date;增長極少許的擴展字段;加上字段註釋COMMENT。熟悉和使用字段設計套路可提高設計效率。oop
根據業務查詢和更新場景,仔細設計好索引。設計組合索引時,區分度高的字段放前面。索引應少而實用,覆蓋性高。熟悉和使用索引設計套路可提高設計效率。性能
考慮運維和排查問題的須要。好比日期採用字符串比時間戳更直觀可讀。大數據
尋找經驗豐富的高級開發者和DBA給出中肯的Review意見並進行完善。
海量數據的搜索/導出/計算應用一般採用大數據存儲,好比Hadoop, ES, Hbase, Storm, Hive, Spark等。
Hadoop是分佈式系統基礎設施的一種實現,提供了分佈式文件服務HDFS和批處理模型Map-Reduce,可用於全量數據同步;
ES(Elasticsearch)是水平可擴展的可靠的分佈式文檔存儲/查詢/分析系統,一般用於海量數據的準實時聯合搜索與分析,提供了RestFul接口風格的API。相比關係型數據庫,ES的優勢在於能夠存儲文檔和對象的完總體,適合多字段的靈活的聯合搜索和全文搜索;ES不適合於事務型應用以及對數據丟失零容忍的應用。一般使用DB+ES的組合,DB用於主存儲,ES用於準實時聯合搜索。
Hbase適用於海量數據的存儲,設計合適的 rowkey 很是重要,一般關乎性能、吞吐量和負載均衡。好比訂單詳情一般是獲取單個或少許訂單的詳情,Rowkey設計更注重負載均衡,高位做爲散列字段; 訂單導出則須要批量獲取大量訂單的全部詳情,Rowkey設計既要注重負載均衡,也要充分考慮Rowkey排序的特性,保證大批量獲取數據的效率。這樣,訂單導出的Rowkey能夠業務屬性來設計,好比店鋪ID+訂單號,或買家ID+訂單號。固然,這種作法的不足在於,對於某些頻繁導出大訂單量的VIP商家,導出的熱點就經常分佈在少數的Region上。能夠統計下導出的店鋪分佈及導出報表行數量,越分散,這種Rowkey設計越有利。
Storm可用於實時數據同步和計算; Hive用於離線統計,提供了類SQL語句; Spark 用於離線計算。因爲這些我接觸很淺,咱很少述。