因為公司有用mongoDB(理由據說是因為速度快),我想這個聽說還不錯的樣子,就研究了一下,這篇文章是描述個人的學習過程與感想
最近花了些時間研究mongoDB
一開始研究的方式是上網到處看,還有看看官方文件
感想是...真他喵的難用
1.資料很容易遺失
2.安全性上不太好
3.我對語法不熟悉
4.沒有Join
5.沒甚麼好用的資料庫管理工具
但我後來慢慢改變我的思維
學mongoDB首先該先了解一下相關名詞
schema和table變成collection與document
那麼就應該把mongoDB的資料想成是一份份的文件集合與文件
文件之間本身是沒甚麼關聯性
一個文件集合裡,格式也可能有落差
以這樣的方式來看會比較能理解mongoDB
這邊描述一下工作的情況:
公司本來使用關聯式資料庫,因為別人的決定,要把資料存到mongoDB同步,於是就變成mongoDB的collection設計跟原本資料庫的table設計一樣。前面也說過了,兩者應該是不同概念的東西才對,mongoDB沒有Join,大概正因為這樣,所以table的資料內容是原本多個table的資料join在一起轉過去的。
我認為會產生以下問題:
1.collection的設計為了跟table搭配,而沒有使用內嵌文件
2.collection的設計會變得很奇怪,存了很多關聯式資料庫關聯用的主鍵與外鍵
3.個人猜測之後同步應該很容易造成很大負擔(沒用index與分割)
我的想法是mongoDB的設計應該要配合使用需求做調整,算是關聯式資料庫的資料副本,避免做資料異動。
之後我從圖書館借了本書來研究
使用命令模式跑了跑書上頭的指令,並且另外作筆記紀錄,透過這樣的方式慢慢的熟悉其語法了。
這是個很花時間的做法,但卻能讓我比較能對語法有印象,否則原本只是看,看過就忘了。雖然現在還是有可能忘,但因為有自己做的筆記,看一看比較能喚回記憶。
我認為除了一般CRUD之外,複製與分割都該理解,最好實際跑一跑,有時語法的實際用法會跟預期的不同。
舉例:
我先新增了一筆學生資料
db.student.insert({"name":"Tom","age":"30","height":"174","weight":"67","date":new Date()})
接著我想把weight改為90,而執行了以下語法:
db.student.update({"name":"Tom"},{"weight":"90"})
結果就會...造成悲劇XDDD(請自行跑看看)
因為這是我練習用的,造成悲劇無所謂,對正式資料造成悲劇就...我也不知道有沒有得救XD
我覺得mongoDB最大的特色在於可以水平擴充
這使得資料庫可以不因為硬碟空間而限制住可儲存的資料量
水平擴充需要使用分割(shard)的技術來實現
另外還可以使用複製組(replica set)來增加資料庫的穩定性(一個掛掉,還有另一個可以接上)
這部分建議特別注意
最後看完借的書與練習後的感想是:
mongoDB始終無法完全取代關聯式資料庫(不可能以後都沒人用關聯式資料庫通通用NoSQL)
但卻能做到一些關聯式資料庫做不到的事情
掌握其優缺點與特性後,再實際運用或把關聯式資料庫的資料轉換過去比較好。
如果是為了用來做大量資料查詢,我會覺得用mongoDB比較好
如果是要進行大量交易,我會覺得別用mongoDB
還不熟悉就使用是非常危險的事情
補充一下:
我看的書是「MongoDB技術手冊」(作者: Kristina Chodorow、Michael Dirolf)
書中有些其實說得沒有很深入,但可以建立一些相關觀念