不論是開會,仍是與人聊技術。最怕的,最煩的,最噁心的就是開口就是: 分佈式,大數據,高併發,微服務解決方案。 遇到這樣的人,開會直接就走了。聊天直接看手機。 想問句:數據庫設計好了嗎?java
新任務是維護一個老項目或者參與一個正在開發的新項目。 第一個要求就是:先提供數據庫設計相關文檔。 架構設計很差,只須要換一套架構。由於有封裝,ioc,aop,模塊等等技術重構就行了。仍是比較好的處理。程序員
數據庫設計很差,不只須要從新設計數據庫,應用層的業務代碼,web應用,app都很可能大改。
維護的成本代價是在太大了,維護成本甚至大於重寫成本。只能項目重寫。不多公司能給你時間,人力,資源重寫。
就算你技術在怎麼牛,能力在怎麼強,架構在怎麼兼容,都無用。沒法逆天。因此數據庫設計很差的項目。一概不接。不敢當這救世主。
領域驅動模型 這種敏捷的開發方式,對整個團隊要求過高了。這裏不詳談。至少在中國能基於 領域驅動模型開發的團隊實在太少了。 基於數據庫開發,纔是大多團隊的首選。web
上面的問題是沒法避免的。可是儘可能不要出現ddl操做,在開始設計或者階段性設計的,儘可能的設計好。仔細的分析需求,不要怕麻煩產品。sql
不要說 數據量的問題。這徹底是藉口。 互聯網公司,大多基礎業務的複雜度都不高,不要說業務複雜。這也是藉口。數據庫
描述: 一個第三方支付系統。須要對接不少支付渠道。好比銀聯,銀行,微信,支付寶等等十來個。由於項目負責人與開發者。沒法概括在一塊兒,並且開始階段就只有銀聯,銀行,微信,支付寶 。爲每一個支付渠道設計了一張表。每一個表保存渠道與商戶的信息。 問題: 後來渠道愈來愈多,表愈來愈多,應用層與數據庫維護愈來愈複雜。性能優化
解決:微信
經驗: 模塊的表設計應該控制在五張以內,最多不能超過八張。若是出現這種狀況是否表設計有問題。是否對業務理解透了。架構
請看sql中的whre語句併發
SELECT * FROM stats_room_energy_day s WHERE ( ( s. YEAR = 2017 AND s. MONTH = 1 AND s. DAY = 2 AND s. HOUR >= 3 ) OR ( s. YEAR = 2017 AND s. MONTH = 1 AND s. DAY = 2 AND s. HOUR <= 10 ) ) and s.area_type = 2
把年,月,日,時個爲一個字段。使之一個字段差分超過四個以上。數據庫多四個字段,實體類多個屬性,頁面展現須要拼接...... 老胡問: 爲何這樣設計 設計者: 這樣方便查詢..... 老胡問: 開發是否很麻煩。 設計者: 還好,耽誤了不少時間(爲了維護這點,編寫了大量代碼),可是查詢方便 老胡問: 性能了? 四個月以後..... 設計者: 業務抗不住了,性能也抗不住了app
只須要稍微改變下
<select> <foreach collection="list" item="item" separator="UNION"> SELECT * FROM stats_room_energy_day s WHERE time > #{startTime} and time < #{endTime} and s.area_type = 2 </foreach> </select>
互聯網數據庫方面是不少軍規的。這些軍規主要是針對 互聯網狀況下高併發,數據量大 其中有一條是 儘可能不要連表查詢。
SELECT o.* FROM t1 o WHERE NOT EXISTS ( SELECT 1 FROM t2 oe WHERE ( oe.operation = 'aaa' OR oe.operation = 'bbb' ) AND flag = 0 AND o.order_id = oe.order_id ) AND ( o.pay_person = 1 OR o.pay_person = 2 OR o.pay_person = 3 OR ( o.pay_person = 4 AND o.pay_status = 1)) AND o.grab_time < date_sub(now(), INTERVAL 5 HOUR) AND o.order_type = 3 AND o.order_status = 5
LIMIT 1000;
3. 連表對微服務不友好 微服務會把每一個業務模塊化。因此模塊之間的數據庫是獨立。沒法進行連表查詢 4. 連表對分庫分表很差友 已知現有的數據庫中間件,對sql語句的解析能力有限,沒法解析複雜的sql語句。只能全片執行或者不執行。全片執行的結果。正確性有待考量。