php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...
關(guān)于DAO數(shù)據(jù)訪問對象設(shè)計(jì)其實(shí)是關(guān)于GoFrame框架工程化實(shí)踐中比較重要一塊設(shè)計(jì)。
DAO設(shè)計(jì)結(jié)合GoFrame的ORM組件性能和易用性都很強(qiáng),可以極大提高開發(fā)和維護(hù)效率。看完本章節(jié)內(nèi)容之后,小伙伴們應(yīng)該能夠理解并體會到使用DAO數(shù)據(jù)庫訪問對象設(shè)計(jì)的優(yōu)點(diǎn)。
一、現(xiàn)有ORM使用示例
使用作者本廠的案例舉例,本廠是互聯(lián)網(wǎng)醫(yī)療企業(yè),所以示例以醫(yī)生相關(guān)接口做示例。需要提前說明的是,這里涉及到的源碼只是方便演示的示例代碼,并不是真正生產(chǎn)使用的源碼。
1、需要定義模型
用戶基礎(chǔ)表(僅作演示,真實(shí)的表有數(shù)十個字段)
醫(yī)生信息表(僅作演示,真實(shí)的表有上百個字段)
2、GRPC接口實(shí)現(xiàn)示例
一個簡單的GRPC查詢醫(yī)生信息接口。
一個簡單的GRPC數(shù)據(jù)查詢接口
二、現(xiàn)有痛點(diǎn)描述
1、必須要定義tag關(guān)聯(lián)表結(jié)構(gòu)與struct屬性,無法做到自動映射
表字段與實(shí)體對象屬性名稱之間原本就有一定的關(guān)聯(lián)規(guī)則,沒有必要定義和維護(hù)大量的tag定義。
大量非必要的tag定義,用于指定數(shù)據(jù)表字段到實(shí)體對象屬性映射
2、不支持通過返回對象指定需要查詢的字段
無法通過返回的對象數(shù)據(jù)結(jié)構(gòu)指定查詢字段,要么只能SELECT * ,要么只能通過額外的方法手動錄入查詢字段,效率很低下。
常見的SELECT *操作,無法根據(jù)接口對象指定查詢字段
3、無法對輸入對象屬性名稱進(jìn)行自動字段過濾
定義了輸入與輸出數(shù)據(jù)結(jié)構(gòu),輸出的數(shù)據(jù)結(jié)構(gòu)已經(jīng)包含我們需要查詢的字段名稱。開發(fā)者輸入定義的返回對象,期望在查詢的時候僅查詢我需要的字段名稱,多余的屬性則不會執(zhí)行查詢,自動過濾掉。
4、需要創(chuàng)建中間查詢結(jié)果對象執(zhí)行賦值轉(zhuǎn)換
查詢結(jié)果不支持struct智能轉(zhuǎn)換,需要額外定義一個中間model模型,再通過其他工具進(jìn)行復(fù)制,效率低。
存在中間臨時的模型對象,用于承接查詢結(jié)果及返回結(jié)構(gòu)對象賦值轉(zhuǎn)換
5、需要提前初始化返回對象,不管有無查詢到數(shù)據(jù)
這種方式不僅不優(yōu)雅,對性能也有影響,還對GC不太友好。期望查詢到數(shù)據(jù)時再自動創(chuàng)建返回對象,沒有查詢到數(shù)據(jù)時什么都不要做。
需要預(yù)先初始化返回對象,不管有無查詢到數(shù)據(jù)
6、沒有DAO對象封裝操作
大部分的Golang初學(xué)者似乎都傾向于使用一個全局的DB對象,在查詢的時候通過DB對象生成特定表的Model對象再執(zhí)行CURD操作,這是一種面向過程的使用方式。這種方式并沒有代碼分層的設(shè)計(jì)可言,使得數(shù)據(jù)操作和業(yè)務(wù)邏輯高度耦合。
原始數(shù)據(jù)庫對象操作方式,沒有DAO封裝
7、太多的字符串硬編碼,例如表名和字段的硬編碼
舉個例子,userId這個字段假如一不小心寫成了UserId或者userid,測試的時候如果沒有完全覆蓋到,在一定的條件下才觸發(fā)查詢操作,是不是會造成新的一場事故呢?
大量的字符串硬編碼
8、不支持鏈路跟蹤
ORM作為關(guān)鍵的功能組件需要支持conetxt傳遞,以便支持鏈路跟蹤。目前無法傳遞鏈路信息,無法在日志中打印TraceId等鏈路信息字段。
9、不支持SQL日志輸出
并且需要支持開關(guān)功能,當(dāng)出現(xiàn)問題的時候可以定位到具體的SQL,并且可以在日志中看到具體的鏈路信息。
三、改進(jìn)方案設(shè)計(jì)
1、查詢結(jié)果對象無需特殊標(biāo)簽定義
2、支持根據(jù)指定對象自動識別查詢字段,而不是全部SELECT *
3、支持根據(jù)指定對象自動過濾不存在的字段內(nèi)容
4、使用DAO對象封裝代碼設(shè)計(jì),通過對象方式操作數(shù)據(jù)表
5、DAO對象將關(guān)聯(lián)的表名及字段名進(jìn)行封裝,避免字符串硬編碼
6、無需提前定義實(shí)體對象接受返回結(jié)果,無需創(chuàng)建中間實(shí)體對象用于接口返回對象的賦值轉(zhuǎn)換
7、查詢結(jié)果對象無需提前初始化,查詢到數(shù)據(jù)時才會自動創(chuàng)建
8、支持context輸入,以便支持鏈路跟蹤
9、支持SQL日志輸出能力,支持開關(guān)功能
10、數(shù)據(jù)模型、數(shù)據(jù)操作、業(yè)務(wù)邏輯解耦,支持Dao及Model代碼工具化自動生成,提高開發(fā)效率,便于規(guī)范落地
采用DAO設(shè)計(jì)改進(jìn)后的代碼示例
總結(jié)
以上是生活随笔為你收集整理的php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS launch文档介绍
- 下一篇: 全新柯迪亚克正式上市:18.69万起 斯