后端開發(fā)關(guān)系數(shù)據(jù)庫(kù)的開發(fā)管理新思路

      網(wǎng)友投稿 911 2022-05-30

      在工作上遇到的各類開發(fā)需求中,只要涉及到后端功能,關(guān)系數(shù)據(jù)庫(kù)的使用幾乎不可避免。雖說(shuō)有各類NoSQL產(chǎn)品競(jìng)爭(zhēng)和補(bǔ)充,但是它們沒(méi)法完全替代關(guān)系數(shù)據(jù)庫(kù),實(shí)際上也很難替代。各項(xiàng)技術(shù),各有各的優(yōu)點(diǎn)和長(zhǎng)處。我這里提出一個(gè)經(jīng)過(guò)實(shí)踐檢驗(yàn)總結(jié)出來(lái)的新的數(shù)據(jù)庫(kù)開發(fā)、管理思路。也許早已經(jīng)有人采用這個(gè)思路和辦法,這里的新是對(duì)我而言。

      大量的開發(fā)者使用關(guān)系數(shù)據(jù)庫(kù)都會(huì)遇到一個(gè)痛點(diǎn):“阻抗不匹配”。(阻抗不匹配:指持久化存儲(chǔ)數(shù)據(jù)所采用的數(shù)據(jù)模型與編寫程序時(shí)所采用的數(shù)據(jù)模型有差異。)

      因?yàn)閿?shù)據(jù)庫(kù)使用標(biāo)準(zhǔn)的SQL語(yǔ)言操縱數(shù)據(jù),而連接操作數(shù)據(jù)庫(kù)的語(yǔ)言則五花八門,語(yǔ)言特性差別很大。這里面讓人頭疼的地方是:不管你是什么用語(yǔ)言開發(fā),操作數(shù)據(jù)庫(kù)都必須使用SQL語(yǔ)言,你需要把語(yǔ)言的數(shù)據(jù)及操作,映射到數(shù)據(jù)庫(kù);此外,敏捷思維下迭代開發(fā)很多,特別是前期,數(shù)據(jù)庫(kù)表、視圖結(jié)構(gòu)的設(shè)計(jì)并不是穩(wěn)定的,也經(jīng)常隨著需求變化,時(shí)不時(shí)的都要修改表結(jié)構(gòu)、字段屬性,同時(shí)再同步修改對(duì)它的操作過(guò)程。

      對(duì)于操作數(shù)據(jù)庫(kù)的語(yǔ)言匹配問(wèn)題,社區(qū)開發(fā)出各種語(yǔ)言內(nèi)的ORM系統(tǒng),試圖用本語(yǔ)言自己的對(duì)象及操作方法,自動(dòng)的轉(zhuǎn)化為對(duì)數(shù)據(jù)庫(kù)的操作調(diào)用。這種模式發(fā)展的還算比較成功,Python/PHP/Java等語(yǔ)言,主流開發(fā)框架都有自己的ORM實(shí)現(xiàn)。除了個(gè)別特殊情況,現(xiàn)在幾乎已經(jīng)沒(méi)人在開發(fā)框架內(nèi)手寫拼接SQL語(yǔ)句查詢了。如果有,你需要立刻反思下自己的數(shù)據(jù)庫(kù)Model設(shè)計(jì)是否不夠合理,以及是否沒(méi)有了解掌握語(yǔ)言框架的ORM系統(tǒng)。使用ORM系統(tǒng)優(yōu)點(diǎn)多多,方便安全,這是首選方法。

      另外一個(gè)問(wèn)題,目前看,似乎還沒(méi)有標(biāo)準(zhǔn)、成熟的解決方式。恐怕大部分人還是開發(fā)的時(shí)候,利用數(shù)據(jù)庫(kù)客戶端工具,手工設(shè)計(jì)、修改數(shù)據(jù)庫(kù)結(jié)構(gòu),處理各種數(shù)據(jù)庫(kù)表,再跟自己的程序聯(lián)調(diào)。后面需求變更,再繼續(xù)修改數(shù)據(jù)庫(kù)和程序,循環(huán)往復(fù)。即便借助工具設(shè)計(jì)操作,也沒(méi)擺脫數(shù)據(jù)庫(kù)客戶端,也是手工的一類。 這樣的實(shí)踐過(guò)程,是比較低級(jí)的,對(duì)數(shù)據(jù)庫(kù)的變更操作往往缺乏記錄和管理。另外還需要開發(fā)者時(shí)不時(shí)的切換到SQL模式,使用它的規(guī)則來(lái)行動(dòng)。這是一種心智負(fù)擔(dān)。你的關(guān)注點(diǎn)是分散的,需要同時(shí)關(guān)注數(shù)據(jù)庫(kù)的設(shè)計(jì)變更和開發(fā)中操作的變化。另外,開發(fā)過(guò)程往往是線上、測(cè)試兩套數(shù)據(jù)庫(kù)隔離,等開發(fā)出新版系統(tǒng)要部署上線,還需要對(duì)已有的數(shù)據(jù)庫(kù)進(jìn)行修改變更,這個(gè)可不是簡(jiǎn)單的輸出測(cè)試數(shù)據(jù)庫(kù)的表結(jié)構(gòu)安裝覆蓋就能解決的了。線上的庫(kù)里面可是有數(shù)據(jù)的呀!出現(xiàn)一點(diǎn)差錯(cuò)都不可接受。手工操作的弊端和風(fēng)險(xiǎn)是很大的。

      有的朋友可能會(huì)提到:是否可以使用存儲(chǔ)過(guò)程去屏蔽數(shù)據(jù)庫(kù)的結(jié)構(gòu)變化?這個(gè)問(wèn)題在這篇文章里面有詳細(xì)的討論,可以參考:http://davidwaynebaxter.com/2013/10/28/orm-or-sprocs/

      對(duì)于這個(gè)事情,我經(jīng)過(guò)研究發(fā)現(xiàn),業(yè)界著名的Python 語(yǔ)言Web開發(fā)框架 – Django的解決模式很不錯(cuò),值得學(xué)習(xí)研究和借鑒。

      后端功能,并不一定是以Web形式存在。但是Web開發(fā)的飛速發(fā)展,業(yè)界積累了大量的開發(fā)經(jīng)驗(yàn),開發(fā)出十分出眾的框架和配套工具。所以,開發(fā)者如果技術(shù)全面,這里優(yōu)點(diǎn)又體現(xiàn)出來(lái)了:“他山之石,可以攻玉”。你完全可以使用Web開發(fā)的框架/工具,來(lái)管理自己的關(guān)系數(shù)據(jù)庫(kù),而并不需要開發(fā)Web的應(yīng)用。即使需要也并不困難。

      Django的思路是這樣的:**它使用Python語(yǔ)言的對(duì)象類型,模擬數(shù)據(jù)庫(kù)表結(jié)構(gòu)和關(guān)系。它使用ORM操作數(shù)據(jù)庫(kù),又通過(guò)定義“遷移”的過(guò)程,管理表結(jié)構(gòu)和關(guān)系的變化。**只要你按照它的設(shè)計(jì)思路一直演進(jìn)開發(fā),它就能保證線上的庫(kù)也能按線下的測(cè)試庫(kù)一樣,得到正確的修改和變化。

      你需要做的工作就是定義好應(yīng)用里面的Model – 它代表一個(gè)數(shù)據(jù)庫(kù)的表。當(dāng)你需要修改數(shù)據(jù)庫(kù)的時(shí)候,不要去用客戶端工具修改MySQL這些數(shù)據(jù)庫(kù),而是修改Django里面的Model。你對(duì)Model的更改–增刪字段、變更字段的屬性等等,Django會(huì)在遷移操作中進(jìn)行記錄并自動(dòng)執(zhí)行數(shù)據(jù)庫(kù)的修改。這樣,你的關(guān)注點(diǎn)就只有一個(gè)了。Django定義了一個(gè)makemigrations操作,自動(dòng)掃描各應(yīng)用中Model的狀態(tài),與實(shí)際數(shù)據(jù)庫(kù)的差異并記錄下來(lái)。然后在后面的migrate操作中,執(zhí)行修改行為,這樣線下線上的映射關(guān)系,就自動(dòng)的保持一致了。Django會(huì)自動(dòng)的保存所有變更記錄,可以放在Git里面管理。而且,你的Model就是ORM操作中使用的對(duì)象,完全不存在代碼重復(fù)和管理麻煩的問(wèn)題。

      后端開發(fā)中關(guān)系數(shù)據(jù)庫(kù)的開發(fā)管理新思路

      這個(gè)設(shè)計(jì)思路十分的優(yōu)秀,非常合理。經(jīng)過(guò)我的使用驗(yàn)證,非常的好用方便。反觀另外一大Web開發(fā)陣營(yíng):PHP語(yǔ)言的框架則沒(méi)有這種思路的實(shí)現(xiàn)。它們也有所謂的“遷移”定義和工具,可是它們的操作是反的,執(zhí)行的是從線上數(shù)據(jù)庫(kù)表映射到框架內(nèi)的Model或者某種文件的表示。如果你更改模型,并不能如同Django一般,簡(jiǎn)單的映射到線上表示,自動(dòng)同步,還需要自己編寫變更腳本。如果誰(shuí)知道哪個(gè)優(yōu)秀的PHP框架做到了,煩請(qǐng)通告。

      Java陣營(yíng)貌似有工具也可以干這個(gè)事情,不過(guò)用的少,沒(méi)仔細(xì)研究。順便說(shuō)一句,Django框架真的很棒,文檔優(yōu)秀,社區(qū)繁榮,性能也不錯(cuò),技術(shù)選型中需要的時(shí)候值得大力推薦。不同的陣營(yíng),設(shè)計(jì)出現(xiàn)這種差別,不知道是否是語(yǔ)言實(shí)現(xiàn)的原因,按道理大家都是相互學(xué)習(xí)借鑒的呀。Python語(yǔ)言天然的適合這種映射的表示,使用Django系統(tǒng)中的Python對(duì)象來(lái)表達(dá)數(shù)據(jù)庫(kù)表,真的是太容易、太方便了。而且Django把Model的表示內(nèi)容單獨(dú)抽離,設(shè)計(jì)的結(jié)構(gòu)很理想。

      所以,如果你使用的框架無(wú)法做到從Model自動(dòng)映射、同步到數(shù)據(jù)庫(kù)表結(jié)構(gòu),而你能操縱Python陣營(yíng)的系統(tǒng),在覺(jué)得成本合理的情況下,完全可以單獨(dú)建立一個(gè)Django工程來(lái)管理數(shù)據(jù)庫(kù),而不必實(shí)現(xiàn)其Web功能,需要的時(shí)候也真的不難。同時(shí),可以讓你采用的語(yǔ)言框架、系統(tǒng),用工具從線上再同步回來(lái),由Table映射到Model,這樣變更就容易的多了。等你的系統(tǒng)上線的時(shí)候,就會(huì)明白,有專業(yè)的系統(tǒng)管理是多么好的一件事了,一條命令就實(shí)現(xiàn)了線上的數(shù)據(jù)庫(kù)變更操作。

      下面給出一些參考鏈接,有興趣的朋友們可以繼續(xù)研究研究。更好的開發(fā)模式可以有效的提升產(chǎn)品質(zhì)量和開發(fā)效率,所以,我對(duì)于尋找更好的方法從來(lái)都是樂(lè)此不疲的。

      MyBatis Migrations:http://www.mybatis.org/migrations/index.html

      Flyway:https://flywaydb.org/documentation/

      Phinx Migrations:https://book.cakephp.org/3.0/en/phinx.html

      Django Migrations:https://docs.djangoproject.com/en/2.0/topics/migrations/

      本文轉(zhuǎn)載自異步社區(qū)。

      軟件開發(fā)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:華為云IoT Openlab介紹和測(cè)試資料介紹總貼
      下一篇:利用花生殼PHTunnel,讓樹莓派+git支持內(nèi)網(wǎng)穿透
      相關(guān)文章
      色老板亚洲视频免在线观| 亚洲国产成人精品不卡青青草原| 久久精品亚洲精品国产色婷| 亚洲国产精品一区二区第一页| 亚洲综合另类小说色区色噜噜| 国产精品亚洲w码日韩中文| 亚洲无线一二三四区手机| 亚洲人成国产精品无码| 亚洲精品岛国片在线观看| 亚洲精品无码专区2| 亚洲一区精品伊人久久伊人| 精品国产亚洲一区二区在线观看| 亚洲日韩中文字幕日韩在线| 久久久久无码专区亚洲av| 国产亚洲欧洲Aⅴ综合一区 | 日本亚洲免费无线码| 亚洲一级黄色大片| 亚洲人成电影网站久久| 亚洲乱色伦图片区小说| 亚洲精品无码高潮喷水A片软| 亚洲av日韩aⅴ无码色老头| 国产精品久久久久久亚洲小说| 一本色道久久88综合亚洲精品高清| 色噜噜的亚洲男人的天堂| 亚洲国产高清精品线久久| 在线观看午夜亚洲一区| 亚洲AV无码精品色午夜果冻不卡 | 亚洲第一第二第三第四第五第六| 亚洲AV无码专区亚洲AV桃| mm1313亚洲国产精品美女| 亚洲一级特黄无码片| 亚洲国产精品福利片在线观看 | 国产精品国产亚洲区艳妇糸列短篇| 国产午夜亚洲精品不卡| 色久悠悠婷婷综合在线亚洲| 亚洲av福利无码无一区二区| 亚洲成综合人影院在院播放| 亚洲一区二区三区写真 | 亚洲一级二级三级不卡| 亚洲午夜久久久精品电影院| 亚洲区日韩精品中文字幕|