# SQL v.s. NoSQL 資料庫是什麼? ## 📌Introduction 在資料庫的世界裡,有兩大主要的類別:**SQL和NoSQL**亦或者是**關聯式資料庫(relational databases)和非關聯式資料庫(non-relational databases)。** > 這兩者之間最主要的差別在於:建立方式的不同、資料類型的不同、儲存方式的不同。 關聯式資料庫是結構化(structured)的,就像是電話簿只儲存電話號碼和對應的姓名。非關聯式資料庫則是檔案導向(document-oriented and distributed)的,就像是一個資料夾,裡面可能裝你的身分證號碼、生日、學生證號碼、購物偏好等等。 ![](https://i.imgur.com/qGknNYY.png) ## 📌SQL ### What is SQL & SQL databases? SQL是Structured Query Language的縮寫。而SQL資料庫顧名思義就是用其較為僵硬(rigid)和結構化(structured)的方式去儲存資料。 在1970年代由IBM開發的,每個列(row)代表一個起點(entry),各個行(column)代表不同的資訊,例如:名字、電話號碼、地址...。表(table)和欄位(field)的關係叫做綱要(schema)。在關聯式資料庫裡,任何資料進入之前,綱要都需要被明確定義。 SQL是資料庫架構師(database architects)設計關聯式資料庫時所用的程式語言,像是在MySQL, Oracle等等資料庫中可以執行查詢(queries),也可以獲得、編輯和刪除資料。其中簡單卻強大的JOIN函式,讓開發者可以從多個表合併取得相關資料,非常方便。 ### What is an ER Diagram? ER實體關係圖是Entity-Relationship Diagram的縮寫。在設計資料庫的架構時,ER實體關係圖扮演了非常重要的角色。 > 它是用來描述「實體」與「實體」之間關係的工具。 ER實體關係圖的組成元素有**實體(Entity)、屬性(Attribute)、鍵值(Key)、關係(Relationship)。** 一個「實體」在關聯式資料庫中視為一個「資料表」,對於一個實體而言,它可以含有多個「屬性」(Attribute)用以描述該實體,在關聯式資料庫中,則以資料表的「欄位」來表示。 ![](https://i.imgur.com/W3iaoGB.png) ### Popular SQL Databases and RDBMS's [^first] 1. MySQL: 最受歡迎的開源資料庫,適合CMS(Content Management System(CMS))和部落格(blogs)。 2. Oracle: 用C++開發的物件關聯式(object-relational)的DBMS。如果企業有預算,此資料庫擁有良好的售後服務。Oracle也有推出NoSQL的資料庫。 3. IBM DM2: 是IBM資料庫伺服器 (database server)家族成員之一,主要用來處理更進階的大數據分析。 4. Sybase: 一個關聯式資料庫用於使用Unix OS的企業,也是第一個為了Linux開發的企業入門DBMS。 5. MS SQL Server: Microsoft開發的RDBMS。同時支援SQL和NoSQL。 6. Microsoft Azure: 一個雲端計算平台(cloud computing platform)可以支援各種作業系統,讓使用者在同一個空間儲存(store)、計算(compute)和規模化(scale)。 7. MariaDB:一個強化版(enhanced)的MySQL。 8. PostgreSQL: 物件關聯式的DBMS。不只使用原生SQL,也使用Perl或Python等程序式(procedural)語言。 [^first]: RDBMS是Relational database management system的縮寫。 --- ## 📌【NoSQL】 ### What is NoSQL? > NoSQL 原本是指 Non-SQL 但後來衍生出 Not only SQL的意思(各自解讀),與傳統的關聯式資料庫相比,涵蓋的範圍更廣。 如果你面對的是**巨量(massive)且非結構化(unstructured)的資料**,建構一個關聯式資料庫便是一個不切實際的選擇。相較於傳統的關聯式資料庫系統,NoSQL的系統更加靈活(flexible)。舉例來說,一個WordPress部落格,NoSQL或許是一個更好的選擇,每個資料夾可以存放:照片、文字、讚、連結、圖表等等不同格式的資料,在管理上會更加方便。 相較於關聯式資料庫用表(table),NoSQL是檔案導向(document-oriented)的。好處是像文章、照片、社交帳號資料、影片等等都可以被包在同一個資料夾中。雖然此種方式較為直覺(intuitive),但是在存取上更加費力(extra processing effort)。因此像Hadoop這種開源的雲端計算和巨量資料分析平台就很適合與NoSQL連結。 另外一個優點是,傳統的關聯式資料庫不適合物件導向程式語言(object-oriented programming e.g. Java, PHP. Python),然而NoSQL資料庫可以透過APIs去避免這個問題,讓開發者不需要完整了解SQL和底層的資料庫系統。 ### Common types of NoSQL databases ![](https://i.imgur.com/6EyJ5K5.png) 1. 鍵-值模型(Key-value model):最為簡單的NoSQL,以鍵(key)和值(value)做儲存。e.g. Cassandra, Azure, LevelDB, Riak. 2. 行存放(Column store):存取資料以行(column)為主,更像是一個倒過來的(inverted)表格,具有高擴展性(Scalability)和高效能(performance)等特點。e.g. HBase, BigTable, HyperTable. 3. 檔案資料庫(Document database):繼承鍵值的觀念,每個檔案有其獨立的資料和鍵,是一個很好獲取和管理資料的方法,只不過某些程度上也是結構化的。e.g. MongoDB, CouchDB. 4. 圖數據庫(Graph database): 資料間是有圖形連結的(interconnected)。e.g. Polyglot, Neo4J. ### Popular NoSQL databases [^second][^third] 1. MongoDB: 在新創公司中,最為熱門的NoSQL系統。檔案導向的資料庫和json-like檔案。另外是開源資料庫,因此是免費的。 2. Apache's CouchDB: 運用JSON資料交換的格式去儲存檔案,JavaScript用來索引(indexing)、合併(combining)和轉換(transforming)檔案;HTTP作為API。 3. Redis: 一個熱門的鍵-值資料庫。 4. Riak: 由Erlang寫成的開源鍵-值資料庫,它內建容錯複製(fault-tolerance replication)和自動資料分配(automatic data distribution),使其擁有良好的效能。 3. HBase: 為一個Apache project,為Hadoop的一部分。 4. Oracle NoSQL: Oracle加入NoSQL的領域。 5. Apache's Cassandra DB: 由Facebook創建,Cassandra是一個分散式的資料庫,易於處理大量的結構化(structured)資料 (e.g. Instagram, Comcast...) [^second]:Apache軟體基金會(Apache Software Foundation(ASF)),是專門為支援開源軟體專案而辦的一個非營利性組織。 [^third]:Erlang是一種通用的平行導向程式語言,目的是創造一種可以應付大規模並發活動的程式語言和執行環境。 ## 📌SQL v.s. NoSQL Databases ![](https://i.imgur.com/yrfvs1v.png) ## 📌What database solution is right for you? ### When to use SQL? 1. 需要確保ACID(原子性Atomicity, 一致性Consistency, 獨立性Isolation, 持久性Durability)四要素時。通常情況下,NoSQL為了追求靈活度(flexibility)和處理速度(processing speed),常常會犧牲掉此四要素。 2. 原本的資料就是結構化(structured)且不會變動(unchanging)的。 ### When to use NoSQL? 1. 需要儲存大量的資料且這些資料幾乎是沒有結構的。 2. 需要極大化使用雲端計算和雲端儲存(Cloud computing and storage)時。 3. 需要快速開發某些功能且會高頻率更動資料結構時。 ## 📌Conclusion 總結來說,這兩種資料庫並沒有高低優劣之分,端看你要處理的資料和當下的應用情境再做決定即可。 ## 📌Comments Please feel free to correct my mistakes in the article😊. If u have any further questions or cooperation opportunities, please contact me via Email📬: willie880201044@gmail.com ## 📌References 1. SQL vs. NoSQL Databases: What’s the Difference? https://reurl.cc/eEoKk7 2. FileMaker認識 database, table, field, layout 基本名詞: https://reurl.cc/yEbE88 3. The Types of Modern Databases: https://reurl.cc/eEbm5j 4. Example Entity Relationship Diagram: https://reurl.cc/EnNZKv 5. ER Model 實體關係圖: https://reurl.cc/6a4Edb 6. 鍵-值資料庫Wiki: https://reurl.cc/VEZjZA 7. Apache Wiki: https://reurl.cc/LbxQLa 8. Erlang Wiki: https://reurl.cc/3aAbEX