云开发数据库VS传统数据库丨云开发101
云開發(fā)數(shù)據(jù)庫(kù)與傳統(tǒng)數(shù)據(jù)庫(kù)的不同
在小程序·云開發(fā)中,最核心的便是三大組件:數(shù)據(jù)庫(kù)、云存儲(chǔ)和云函數(shù),從今天開始,我們將開始隔日更的專欄文章,云開發(fā)101,在第一周,我們將從最最核心的數(shù)據(jù)庫(kù)開始說起。
云開發(fā)數(shù)據(jù)庫(kù)簡(jiǎn)介
首先,我們先來了解一下云開發(fā)的數(shù)據(jù)庫(kù),云開發(fā)數(shù)據(jù)庫(kù)是由云開發(fā)團(tuán)隊(duì)提供給云開發(fā)用戶的數(shù)據(jù)庫(kù)服務(wù),開發(fā)者可以在小程序、云函數(shù)等環(huán)境中,通過簡(jiǎn)潔易懂的函數(shù)調(diào)用,來獲取到對(duì)應(yīng)的數(shù)據(jù),方便開發(fā)者快速完成業(yè)務(wù)邏輯中關(guān)于數(shù)據(jù)庫(kù)的部分。
在開發(fā)過程中,你可以使用諸如 wx.cloud.database().collection('data').where({"age":10}).get() 這樣的方法獲取到數(shù)據(jù)庫(kù)中的信息,而無需再通過服務(wù)端提供的 API 完成數(shù)據(jù)庫(kù)請(qǐng)求,將數(shù)據(jù)查詢的權(quán)力下放到小程序端,加快應(yīng)用的迭代效率。
云開發(fā)數(shù)據(jù)庫(kù)底層技術(shù)簡(jiǎn)介
云開發(fā)數(shù)據(jù)庫(kù)所使用的是 NoSQL (Not Only SQL)數(shù)據(jù)庫(kù)方案中的 MongoDB 數(shù)據(jù)庫(kù)。MongoDB 數(shù)據(jù)庫(kù)是目前業(yè)界發(fā)展的最好的 NoSQL 數(shù)據(jù)庫(kù),可以讓開發(fā)者以 SQL 和 NoSQL 兩種方式完成數(shù)據(jù)庫(kù)結(jié)構(gòu)的建設(shè),快速完成應(yīng)用的開發(fā)。
NoSQL 與 SQL
我們?cè)趥鹘y(tǒng)的 Web 應(yīng)用開發(fā)過程中,大多使用的是 SQL 數(shù)據(jù)庫(kù),如 Oracle、SQLite、MySQL、MSSQL 等,但云開發(fā)所使用的 MongoDB 則是完全不同的數(shù)據(jù)庫(kù)方案,因此,在進(jìn)行數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)時(shí),也有所不同。錯(cuò)誤的思考模型,會(huì)使得你在后續(xù)的應(yīng)用開發(fā)過程中,給自己帶來無盡的麻煩。因此,也就有了我們這篇文章,向你介紹 NoSQL 世界的魅力。
Schemaless 帶來的特性
在我們使用 SQL 數(shù)據(jù)庫(kù)開發(fā)時(shí)我們需要先行設(shè)計(jì)好數(shù)據(jù)庫(kù)的結(jié)構(gòu)、數(shù)據(jù)表的結(jié)構(gòu)等,而 NoSQL 型數(shù)據(jù)庫(kù),因此,讓我們?cè)陂_發(fā)的時(shí)候,也會(huì)有了不同的開發(fā)模式。我們無需在進(jìn)行應(yīng)用開發(fā)時(shí),先行添加表結(jié)構(gòu),我們只需要根據(jù)我們自己的使用情況,隨時(shí)增加、刪除新的字段,完成自己的業(yè)務(wù)需求,也正是這種自由,使得云開發(fā)有了快速開發(fā)、快速迭代的特性。
云開發(fā)數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)思路
由于云開發(fā)所使用的數(shù)據(jù)庫(kù)類型與我們所熟悉的數(shù)據(jù)庫(kù)類型不同,因此,在開發(fā)的時(shí)候,我們也要相應(yīng)的修改我們的數(shù)據(jù)庫(kù)結(jié)構(gòu),以適配 NoSQL 數(shù)據(jù)庫(kù)的各項(xiàng)特性,從而降低編程時(shí)的復(fù)雜度,又好又快的滿足自己的業(yè)務(wù)需求。
和 SQL 數(shù)據(jù)庫(kù)不同, MongoDB 數(shù)據(jù)庫(kù)由于其存儲(chǔ)結(jié)構(gòu)從設(shè)計(jì)之初便是考慮分布式、多節(jié)點(diǎn)存儲(chǔ),其 Best Practice 是「以空間換時(shí)間」,因此,在設(shè)計(jì)應(yīng)用數(shù)據(jù)結(jié)構(gòu)時(shí),不要考慮應(yīng)用的數(shù)據(jù)存儲(chǔ)空間,而是更多思考,如何以更快的速度將數(shù)據(jù)查詢出來。
但是,數(shù)據(jù)庫(kù)的設(shè)計(jì)不能完全追求時(shí)間,也要思考編程的復(fù)雜程度,平衡時(shí)間、空間與編程復(fù)雜度,以一個(gè)更好的方式完成自己的數(shù)據(jù)庫(kù)設(shè)計(jì)。
舉個(gè)例子,因?yàn)闃O度追求數(shù)據(jù)的空間換時(shí)間,整個(gè)數(shù)據(jù)系統(tǒng)的多種數(shù)據(jù)僅設(shè)計(jì)一個(gè)集合,所有的數(shù)據(jù)都掛在一個(gè)集合中,顯然是不合理的,這種存儲(chǔ)會(huì)導(dǎo)致應(yīng)用后續(xù)的迭代造成麻煩。
同樣的,極度的不追求空間換時(shí)間,也是一種錯(cuò)誤的選擇,如果你將所有的數(shù)據(jù)都放在各自的獨(dú)立集合中,則會(huì)造成沒有很好的利用 NoSQL 數(shù)據(jù)庫(kù)的特性,也會(huì)使得你的后續(xù)編程變得麻煩。
因此,在使用云開發(fā)數(shù)據(jù)庫(kù)時(shí),我們需要思考我們的業(yè)務(wù)發(fā)展方向,將可能會(huì)用到的場(chǎng)景進(jìn)行割離,思考應(yīng)用的數(shù)據(jù)庫(kù)結(jié)構(gòu),從而確保自己的應(yīng)用在后續(xù)開發(fā)的時(shí)候不出問題。
云開發(fā)數(shù)據(jù)庫(kù)使用常見問題
在實(shí)際的應(yīng)用中,我們也看到,不少人因?yàn)椴皇煜?NoSQL 的數(shù)據(jù)庫(kù)設(shè)計(jì)理念,在實(shí)際開發(fā)過程中,出現(xiàn)了不少的問題,這里我們一一討論一下。
自建主鍵屬性
在 MongoDB 數(shù)據(jù)庫(kù)中,數(shù)據(jù)存儲(chǔ)使用的是 ObjectID,因此,其數(shù)據(jù)的 ID 并非 1 ,2 ,3 ,4 ,而是一個(gè)類似于 a718a0f318d76 hash 值,不少人在開發(fā)時(shí),因?yàn)檎J(rèn)為沒有自增的數(shù)據(jù),無法完成數(shù)據(jù)排序,就自行實(shí)現(xiàn)了一個(gè)自增的 ID,每次新增的時(shí)候,都重新查詢一遍,獲取最新的值以后, 再重新新增數(shù)據(jù)。
但實(shí)際上,我們可以有一種更加優(yōu)雅和方便的工具來完成這種需求,那就是新增一個(gè)字段 created_at,這個(gè)字段的值設(shè)置為當(dāng)前時(shí)間的時(shí)間戳 Timestamp。當(dāng)你后續(xù)需要進(jìn)行數(shù)據(jù)按新增的數(shù)據(jù)進(jìn)行排序時(shí),可以使用這個(gè)字段進(jìn)行逆序排序,同時(shí),因?yàn)檫@個(gè)數(shù)據(jù)使用的是當(dāng)前的時(shí)間數(shù)據(jù),你還可以將其用于數(shù)據(jù)的「創(chuàng)建于XX年XX月XX日」的功能,完成自己的業(yè)務(wù)需求。這個(gè)數(shù)據(jù)除了能進(jìn)行直接的排序,還可以用于后續(xù)按日期導(dǎo)出數(shù)據(jù),比如篩選出某一個(gè)特定時(shí)間段的數(shù)據(jù)。
相比于一個(gè)自增的 ID,created_at 更加的簡(jiǎn)單易用,同時(shí),因?yàn)椴恍枰崆矮@取上一條記錄中這個(gè)字段的值,可以有效的降低數(shù)據(jù)的查詢次數(shù)。
時(shí)間存儲(chǔ)問題
在我們進(jìn)行業(yè)務(wù)邏輯開發(fā)時(shí),時(shí)間數(shù)據(jù)的獲取是不可或缺的,不少人習(xí)慣于使用一個(gè)可視化的日期數(shù)據(jù),便會(huì)將數(shù)據(jù)庫(kù)中的日期字段設(shè)置為 2019-09-09,以便于在使用時(shí)直接輸出到數(shù)據(jù)庫(kù)中,但實(shí)際上在開發(fā)過程中,建議大家存儲(chǔ)時(shí)間戳 Timestamp 來作為具體的時(shí)間。
這是因?yàn)?2019-09-09 的數(shù)據(jù)并非一個(gè)可以用于排序的字段,在后續(xù)開發(fā)的過程中,因?yàn)槟闶褂玫氖亲址鳛闀r(shí)間,如果你需要將數(shù)據(jù)進(jìn)行排序,將會(huì)無法排序或出現(xiàn)排序錯(cuò)誤的情況;此外,因?yàn)槟愦鎯?chǔ)的是字符串類型的時(shí)間,那么后續(xù)如果你的業(yè)務(wù)需求發(fā)生了展示形式的變化,會(huì)導(dǎo)致你花費(fèi)大量的時(shí)間去修改所有數(shù)據(jù)的時(shí)間,或者在數(shù)據(jù)的讀取和存儲(chǔ)時(shí)進(jìn)行多次格式轉(zhuǎn)換,徒增麻煩。
因此,對(duì)于時(shí)間存儲(chǔ)有需求的,我們一貫建議大家使用時(shí)間戳來存儲(chǔ),因?yàn)闀r(shí)間戳是一個(gè)數(shù)字類型的數(shù)據(jù),因此可以直接進(jìn)行大小的比對(duì),同時(shí),因?yàn)闀r(shí)間戳的數(shù)據(jù)是全球統(tǒng)一的,如果你的應(yīng)用后續(xù)有全球化的需求,也可以很好的支持。
無法區(qū)分是否要拆分為獨(dú)立的數(shù)據(jù)集合存儲(chǔ)
在進(jìn)行云開發(fā)的數(shù)據(jù)應(yīng)用開發(fā)的時(shí)候,我們發(fā)現(xiàn),不少開發(fā)者的疑問是,我所使用的數(shù)據(jù),是否有必要進(jìn)行獨(dú)立拆分出一個(gè) Collection 來進(jìn)行數(shù)據(jù)存儲(chǔ)。
這個(gè)問題我們可以以一些簡(jiǎn)單的問題來判斷:
這里我們舉幾個(gè)例子來說明一下,比如說,我們有一個(gè)需求,是為一個(gè)內(nèi)容發(fā)布系統(tǒng)的文章新增評(píng)論功能,那么我們應(yīng)該如何完成這部分呢?
如果你的評(píng)論數(shù)據(jù)沒有排序、修改,也僅在此處使用,你可以考慮將評(píng)論數(shù)據(jù)放在文章數(shù)據(jù)中的一個(gè)子屬性中,這樣可以有效的完成數(shù)據(jù)查詢,你在文章進(jìn)行查詢的時(shí)候,直接將評(píng)論數(shù)據(jù)查詢出來,并進(jìn)行顯示,十分的方便。
如果你的評(píng)論數(shù)據(jù)有排序、修改以及其他地方使用的需求,那么就建議你將評(píng)論數(shù)據(jù)單獨(dú)存放在一個(gè)集合中,以便在后續(xù)完成排序、更新和調(diào)用,如果此時(shí)你將其放在文章數(shù)據(jù)中,在后續(xù)查詢時(shí)就會(huì)有很多問題,操作起來極為不便,給自己徒增煩惱。
當(dāng)然,具體情況具體分析,如果你在分析完成后,依然沒有答案,可以在公眾號(hào)后臺(tái)提出你的問題,我們將盡快給您回復(fù)。
總結(jié)
在本次的文章中,我們分享了云開發(fā)所使用的 NoSQL 數(shù)據(jù)庫(kù)與傳統(tǒng)的 SQL 數(shù)據(jù)庫(kù)的區(qū)別,以及因?yàn)檫@種區(qū)別所帶來的開發(fā)體驗(yàn)上的不同,理解這些基礎(chǔ)內(nèi)容,將會(huì)幫助你更好的應(yīng)用云開發(fā)數(shù)據(jù)庫(kù)開發(fā)你自己的產(chǎn)品。
如果你對(duì)于云開發(fā)有任何問題,都?xì)g迎你在文章留言出留下你的疑問,我們將一一解答。
如果你想要了解更多關(guān)于云開發(fā)CloudBase相關(guān)的技術(shù)故事/技術(shù)實(shí)戰(zhàn)經(jīng)驗(yàn),請(qǐng)掃碼關(guān)注【騰訊云云開發(fā)】公眾號(hào)~
轉(zhuǎn)載于:https://www.cnblogs.com/CloudBase/p/11510498.html
總結(jié)
以上是生活随笔為你收集整理的云开发数据库VS传统数据库丨云开发101的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优秀技术人的管理陷阱
- 下一篇: 图像质量评价之数据库