PowerDotNet平台化軟體架構設計與實現系列(02):資料庫管理平台

為了DB復用和簡化管理,我們對常見應用依賴的DB模組進行更高級的提取和抽象。

雖然一些ORM可以簡化DB開發,但是我們還是需要進行改進和優化,否則應用越多,後期管理運維越混亂。

根據常見開發需要,資料庫連接串、資料庫元數據管理基本上是合格的開發人員必須要用到的功能。

一、資料庫連接

資料庫連接串管理起來不難,但是寫法隨意可能造成編程開發的混亂。

通常我們寫的應用程式,如果要訪問資料庫,除了調用遠程API服務,基本都會配置一個或多個資料庫連接串,有資料庫密碼安全需要的還需要配置安全模組。隨著應用增多,資料庫連接串使用容易失控。我個人在某廠碰到過某大型CS結構的應用程式,WinForm客戶端赫然寫著各種資料庫連接串,真是呵呵噠。

我們通常按照實際BU業務進行模組劃分,然後將業務數據落地保存至各自的DB中。

PowerDotNet數據管理平台提供了一些簡單工具和介面,方便開發人員管理資料庫連接,我們把資料庫簡易連接功能稱為DBKey或DBRoute(本系列統稱為DBKey,感謝前廠友情提供命名),根據一個DBKey可以快速獲取實際連接串。

除了傳統的RDBMS關係型資料庫,也支援NoSQL、NewSQL、ETCD及Redis之類的快取連接串管理。

根據DBKey的設計初衷,所有業務系統,只有DBKey根服務需要配置一次帶有用戶名和密碼的資料庫連接串,其他地方直接配置DBkey就可以把問題都搞定。

二、元數據

 1、資料庫伺服器

2、欄位管理

其他相關元數據管理,如:

(1)數據表

表和欄位查詢

僅表查詢

(2)視圖

(3)存儲過程

(4)函數

(5)觸發器

相對而言觸發器已經用的非常少了。

(6)索引

PowerDotNet可以像主流RDBMS管理工具一樣實現對資料庫執行基本的增刪改查操作,元數據管理也在持續完善中,常見的死鎖分析、耗時統計、最耗IO的查詢、統計SQL語句執行次數、慢查詢等功能會根據不同資料庫類型陸續集成進來,最終目標是做到完善的DML、DDL和DCL管理控制。

PowerDotNet已經實現了對關係型資料庫SQLServer、MySQL(MariaDB)、PostgreSQL和MariaDB的元數據完全支援,也預留了介面用於擴展支援更多類型的資料庫。

 實際上資料庫管理非常複雜,個人開發只用到常用功能,後續文章還會提到如何高效開發資料庫應用。

三、程式碼生成器

如果熟悉常見的程式碼生成器,大家都能想到這主要是用來生成單表對應的實體、DAL、Json數據、DDL、存儲過程、常用SQL、Form表單、JS(或VUE、TypeScript等)和沒啥特殊邏輯的BLL的。

通常程式碼生成器生成的業務邏輯可以忽略,不要低估業務邏輯的複雜度,根據經驗,寫業務邏輯程式碼同樣需要非常出色紮實的編程功底,建議大家老老實實寫業務邏輯,而DAL層幾乎可以不用改動。

程式碼生成器默認支援SQLServer、MySQL(MariaDB)、PostgreSQL三種資料庫的程式碼生成,這也是PowerDotNet默認支援的三種常用關係型資料庫。

配合DBKey功能,可以省去一堆配置和程式碼,對於一般應用的DAL開發那是相當的爽,誰用誰知道。

1、WinForm版程式碼生成器

2、Asp.Net MVC版程式碼生成器

相對WinForm版本,個人更推崇Web版本的程式碼生成器。

(1)支援DBKey或者連接串直連模式

(2)豐富的程式碼生成和下載選型

(3)程式碼生成和元數據查看

查看生成程式碼,下圖示例是生成的業務邏輯對象截圖。

很多程式碼生成器生成的業務邏輯程式碼都是直接調用DAL方法,其實非常讓人無語,完全沒有「業務邏輯」的存在。PowerDotNet程式碼生成器生成的業務邏輯程式碼,業務邏輯豐富,常見校驗、判重、查詢邊界、批量處理、快取等應有盡有。

查看錶結構

(4)資料庫文檔生成

對資料庫的管理和抽象,可以快速提高我們的開發效率。論針對資料庫的應用開發,配合PowerDotNet自研的ORM工具,很多SQL都可以簡化,DAL層完全可以自動化一行SQL不寫。不過這是另外的開發問題了,本文不做探討。

真實情況下,DB管理平台可以擴展開發出很多功能,比如數據元數據管理、SQL變更管理、SQL版本管理、Job管理等,本文示例圖片主要用於展示開發常用的功能,其他功能沒做介紹。

四、未來計劃

目前PowerDotNet自研的資料庫管理平台,前端用到sql-formatter組件,後端SQL使用了C#版本的SQL formatter(TGSqlParser),對基本的常用SQL進行語法合規性校驗是沒什麼大問題的,但是對於複雜SQL還是略有不足。

業務資料庫開發過程中常見的數據統計、動態執行萬能SQL、動態報表生成等雖然都有相應模組支援,但是還不是很完善,主要是複雜度上去以後還是不容易維護。

YearningArchery是流行的SQL審核查詢和工單管理平台,資料庫管理的基本功能都有,前廠的資料庫工單系統就參考了這兩個開源項目。

PowerDotNet的DB管理平台未來也向DB工單功能靠攏,但是計劃是獨立出一個工單系統來做(最近還很忙,資料庫工單系統這篇文章來不及寫了^_^),包含資料庫工單,將資料庫變更、版本控制和回滾這幾個最重要功能開發出來,而不是所有都集成在當前的資料庫管理平台里。

根據我的理解,資料庫管理平台可以最大程度降低資料庫開發的混亂無序程度,哪怕是非生產環境的資料庫也要嚴格管理起來。我在某廠的時候開發人員已經沒有可能直連資料庫「亂寫亂畫」了。開發使用資料庫管理平台的目標和意義,就是最大可能規範開發人員,解放DBA、運維人員和業務支援,咩哈哈。

參考:

//github.com/zeroturnaround/sql-formatter

//docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.transactsql.scriptdom.tsqlparser

//www.nuget.org/packages/gudusoft.gsqlparser

//support.sqlparser.com

//github.com/sqlparser