為什麼要選擇SQL?
本文解釋為什麼選擇一個NoSQL資料儲存為Web應用程式的資料庫是錯誤的,而選擇傳統的好像無新意的SQL卻是正確的。
人們選擇NoSQL的主要的原因有:
1. 對程式設計師更加容易
使用NoSQL的解決方案是直接將文件寫到資料儲存,而使用SQL則是需要使用Insert插入新資料庫記錄。確實寫入原始JSON物件到資料儲存中比使用Insert SQL語句容易。
下面我們比較一下抓取過去24小時的註冊使用者資訊的案例:
MySQL
SELECT * FROM users WHERE signup_time >= CURDATE() - INTERVAL 1 DAY <p> |
Mongo
db.users.find({ "signup_time": { $gt: new Date(Date.now() - 24*60*60 * 1000) } }) <p> |
在第一種情況下,好像是人類使用交談語言彼此交流,而在第二種是純JavaScript,你必須使用JSON物件構建你的查詢,甚至需要24小時單位轉為毫秒單位。
這還不是結束!最有趣的部分是當你想讓你的資料庫為你提供過去一週所有註冊使用者資訊時,或者至少兩次登陸網站的使用者。使用NoSQL比較麻煩。
而一個簡單的關係查詢,雖然不能在NoSQL資料儲存中直接表達,它卻可以使用一條SQL表達。為了在NoSQL中實現,你必須依靠非標準化denormalisation(需要將資料聚合儲存在某個特定地方,而不是隨時根據需要進行計算),或者使用讓人瘋狂的map-reduce。
不要忘記,如今SQL使用已經是非常容易和超級安全(例如Django的內建ORM和Rails的Active Record),這讓你在大多數情況下避免編寫SQL。
2. 擴充套件性更好
這是個狡猾的陷阱,因為隱含了兩個錯誤的假設:
1. 擴充套件性實際上是你的問題
2. NoSQL擴充套件比現有的SQL解決方案更好
首先,除非你每秒啟動幾千次查詢和幾TB資料,否則擴充套件性就不是問題,萬一有問題,你可以採取一個完全託管的解決方案如AWS的RDS。
其次,NoSQL不比SQL擴充套件更好。至少不是你以為的方式。MySQL用於如臉譜網和推特等高流量的網站,像GitHub和Bsecamp,幾乎都是使用PHP。
NoSQL寫得更快
一般來說這是真的,不過你的應用程式真需要“快寫”嗎?除非你的目標是執行日誌服務之類的,但是你的Web應用程式類似:
一個人寫入內容被其他人查詢消費。
這是臉譜網,推特、YouTube、部落格、網上商店、檔案共享服務等網站的絕大多數工作。你的應用程式也不例外。
選擇一個SQL資料庫正確的原因
每一種技術都有它的優點和缺點,現在我們看看為什麼SQL幾乎是每個Web應用程式的正確選擇。
1. 生態系統
你不能擊敗SQL的生態系統。SQL是自1974就存在的一種語言,時間超過40年。背後有大量的工具和服務。
SQL在世界各地每一個計算機學院教授。所有的雲提供商提供SQL資料庫作為一種服務,你可以零付出使用(例如Amazon的RDS,谷歌雲SQL和SQL Azure資料庫)
這可能聽起來不是很重要,但軟體的進步和演化有一個基礎理念,不重複發明輪子,使用他人提供的解決方案解決常見問題的。
2. 事務和ACID
SQL提網站生產執行的可靠保障。這是因為在市場上幾乎每一個SQL解決方案都可以組合你多個SQL查詢變成一個ACID單元,這稱為事務。
在實踐中,這意味著你可以在你的資料庫組合多個改變為一個事務,你可以提交確認和回滾,這些能夠保證你交易的原子性,一致性,隔離和耐久性。
簡單的說;SQL你可以100%保證意圖確切反映到資料庫中。
3. 儲存
SQL資料庫系統為生產應用中非常重要的另一個重要的“特徵”是:它可以節省您的儲存。
此功能是免費的,因為SQL需要預定義的表結構(schema)才能儲存資料。這允許磁碟只能儲存每行的列內容。相反,NoSQL解決方案必須儲存整個檔案(所有的鍵和值)在磁碟上,因為沒有預先定義的儲存結構檔案。
隨著資料集的增長,問題變得更大,你會很容易有許多 NoSQL的GB級別資料,如果在SQL資料庫系統可能用不到一半。
結論
本文不是對NoSQL資料儲存的否定。市場上最著名的NoSQL資料儲存都是偉大的解決方案,都是為生產環境Web應用準備的。
Redis可能是唯一的一個特殊NoSQL資料儲存,它沒有試圖要求從SQL資料庫遷移出來,這就是為什麼它受到普遍讚揚且能繁榮發展的原因。
相關文章
- 老闆:你為什麼要選擇 Vue?Vue
- 為什麼爬蟲要選擇住宅代理?爬蟲
- 為什麼要選擇蘋果企業簽名?蘋果
- 為什麼要選擇分散式資料庫?分散式資料庫
- 為什麼要選擇電話機器人?機器人
- 為什麼要選擇代理來進行抓取?
- 大公司為什麼要會選擇DevOps?dev
- 分散式鎖為什麼要選擇Zookeeper而不是Redis?分散式Redis
- 中小企業為什麼要選擇雲伺服器?伺服器
- 為什麼要選擇Python進行Web開發?PythonWeb
- 為什麼要選擇做一名程式設計師?程式設計師
- 為什麼還要選擇angular與angular學前準備Angular
- 為什麼選擇Guice框架GUI框架
- Aembit為什麼選擇 Rust?Rust
- 為什麼選擇使用Rust?Rust
- 為什麼要選擇學Python?Python可做哪些事情?Python
- 模切行業的ERP,為什麼要選擇點晴?行業
- 企業為什麼要選擇物件儲存?原因有5點!物件
- 為什麼企業要選擇低程式碼開發平臺?
- 為什麼選擇.NETCore?NetCore
- 為什麼選擇centos系統CentOS
- 為什麼選擇高防DNS?DNS
- 為什麼選擇Cynefin框架? – zwischenzugs框架
- (轉)為什麼選擇機器學習策略機器學習
- 我為什麼選擇 Angular 2?Angular
- Android為什麼選擇binderAndroid
- 為什麼選擇Twitter Storm?薦ORM
- 容器場景要選擇什麼 Linux 版本?Linux
- 為什麼要選擇學習Linux呢?Linux發展如何?Linux
- 為什麼要選擇學習python?學習python的原因!Python
- 進入IT行業,為什麼要選擇學習Python語言?行業Python
- 為什麼要選擇Python進行Web開發?記得收藏!PythonWeb
- 為什麼要建議大家選擇物件儲存?原因有6點物件
- 為什麼要選擇F5的BIG-IP Cloud Edition?Cloud
- ElasticSearch(一)ElasticSearch的應用場景及為什麼要選擇ElasticSearch?Elasticsearch
- 為什麼要選擇Python語言實現機器學習演算法Python機器學習演算法
- 為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?DockerK8S
- 為什麼選擇ASP.NET CoreASP.NET