拆分業務和數據庫應用方案

前言

此篇文章將會介紹一個在實際應用中的解決方案
這些方案是這些項目或者系統在當時的情況下做出的最優解,我會詳細介紹我們是面臨怎樣的問題並且怎樣解決這些問題,或許它不是最優或者是最合理的方式,但是這篇文章或許能爲您帶來一些靈感。
此外,我發佈的文章一定是在項目中使用過的解決方案,是經過時間驗證的,我們可以通過分析這些案例,來爲我們下一次的方案提供正面或者反面教材。
如果您有更好的已經實際使用過的方案願意提供給我們,我們很高興爲您的方案給與酬勞。

一、場景(未重新設計之前)

1. 系統功能說明

這個系統只是衆多業務系統中的一個,並且處於所有數據流的末端,嚴格上來說他是一個報表系統,在我接手時,它已經開發完成。

2 系統架構說明

spring cloud + nacos + redis +mysql
我們大致上使用了以上工具構成了項目框架主題

3.業務說明

我們需要新建一次考試,分配考場和考號,之後需要導入學生的成績數據,通過算法計算後生成學生的行爲分析模型,通過這些行爲模型,系統會提供給學生或者老師能夠使用的統計報表

4.業務流程
在這裏插入圖片描述
5.面臨的問題詳情

1.數據業務流程完全寫死在代碼中,並沒有流程可視化或者可操作的流程控制,導致後面接手的人員幾乎無法理解業務。
2.報表數據需要經過10張表的洗禮才能夠使用,其中牽扯的狀態不下十個,導致表之間的關係難以理解,並且排查數據生成的過程中出現的問題難度很大。
3.在報表統計中常常需要關聯很多張表查詢才能得到全部範圍的數據或者部分數據,這讓查詢變得緩慢。
4.牽扯衆多的前置業務系統,通常該系統需要等待前置系統的業務數據生成,之後才能去獲取數據進行出來,系統之間的頻繁交換數據,導致了數據常常出現缺失或者其他異常情況,這讓這個系統十分的不穩定
5.業務接口的查詢源頭混亂,難以統一維護。

5.詳情
數據庫設計:

這是重新設計之前的數據庫結構

二、解決方案分析

業務層面:

報表系統應該專注於他的報表業務,在生成報表數據的流程中,我們有很多步驟都嵌套了其他系統的數據,但是反觀一想,這些數據都是作爲必須的前置條件,他們之間的聯繫相當緊密,但他們實質上能夠分離出來作爲生成報表數據的第一步。

數據庫層面:

既然我們在業務上讓所有前置條件業務在概念上都歸爲一步,那爲什麼不能將下一步,也就是報表數據單獨成立一張表,這張表中只存儲已生成的未出現錯誤的報告呢?

三、方案實施歸納

1.我們決定把創建考試到算法計算這個流程化零爲整,他們都是同一個工作,數據生成或者清洗
2.新建一張真正的報表表儲存靜態數據。

四、方案實施詳情

1.數據庫設計
我們只留下了四張表

2.業務流程
我們發現之前的業務並不需要儲存那麼多的數據,只需要在覈心算法計算前把數據給到算法便會得到結果我們發現之前的業務並不需要儲存那麼多的數據,只需要在覈心算法計算前把數據給到算法便會得到結果

3.核心說明

1.rep_detail表是一張非關係型的結構,他儲存的數據是每一次考試每一科目每個人的每道題的答題情況,在統計報表時,只需要切換字段和數據範圍,就能得到業務接口想要的報表數據,他根本不需要與其他表進行連表查詢,所有的查詢入口都應該是eval_exam,在此處,我們甚至不需要去關心eval_exam_subject,因爲我們的rep_detail中擁有eval_exam_subject中的一切。

rep_detail表字段rep_detail表字段

2.既然現在我們無需擔心業務接口獲取數據的方式,那我們剩下的就是維護好核心算法計算前的數據準備工作,準備好所需的數據並對他們進行清洗是一個複雜並且帶有挑戰的業務。
3.在數據準備過程中幾乎沒有流程來控制業務,只有上一步的成功與否,更加利於排查錯誤。

五、重新設計後遇到的問題

1.主要問題

1.red_detail中常常一次考試便會生成幾十萬條數據,數據庫由此變得緩慢。
2.red_detail字段的多樣性,讓業務sql變得複雜和難以理解。

2.如何解決問題

1.更換mysql數據庫引擎爲MyISAM,此時我們的靜態表rep_detail不再需要事務來保證它的安全,因爲它的數據經過預清洗保證了數據的有效性,從而讓新增數據變得更快。
2.增加mysql索引,讓複雜的查詢sql變得更快。
此表中只有一個索引此表中只有一個索引

3.我們在代碼中的web層增加了redis,讓接口除第一次查詢之外均能保證響應速度(由於索引原因,第一次查詢最糟糕的接口最長等待時間爲10s)。
4.我們的新設計和結構讓數據脫離了業務,也讓業務能夠離開數據,當接口變得難以維護時或者其他系統進行了大幅度的改動,這個接口的重寫工作爲因爲我們的設計變得輕鬆,新接手的人員只需要理解rep_detail的字段意思和接口業務,就能夠直接重寫接口,而不需要擔心其中會有某些沒注意到的業務細節或者與其他系統的關係。

六、最後

這是我寫的第一篇文章,不足之處請大家多多包涵,多提意見。
我的身邊有更多優秀的人才,他們也會爲我的文章提供更好的素材。
如果覺得我的文章還不錯,可以關注我的公衆號(剛起步)
以後的文章將會在公衆號首發,我們相信實踐出真知,踐行出真理
名稱:java企業級應用
二維碼:
請大家多多支持請大家多多支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章