--- tags: AIOT馬拉松講義 --- ![](https://i.imgur.com/1OJ8ePQ.png) # D06 SQL & NOSQL 資料庫介紹 ![](https://i.imgur.com/kbVsCVJ.png) ### 重要知識點 #### SQL 資料庫介紹 * 資料庫操作語言 DDL、DML、DCL、DQL介紹 * SQL 資料庫標準操作語言 * 關聯式資料庫-正規化 #### NoSQL 資料庫介紹 * NoSQL 資料庫特性 * NoSQL 開源資料庫介紹 #### SQL 與 NoSQL 資料庫特性比較 ### SQL資料庫系統介紹 * SQL 資料庫系統可方便的進行資料儲存、更新、刪除、查詢等需求,具有標準的操作語言,是一個成熟穩定的技術,坊間已經有各種 SQL 資料庫系統,如商業版本的 Oracle、Microsoft Database Server、MySQL、IBM DB2 等,而在免費開放原始碼的 SQL 資料庫系統上,有PostgreSQL、MariaDB 等。 * 上述這些商業或免費開源的 SQL 資料庫,因為都支援標準的 ANSI-SQL 語法,所以在資料的儲存跟系統轉換上,以及各種異質系統的開發上,有了清楚統一的開發流程。 * ANSI-SQL 主要定義了 DDL、DML、DCL、DQL 等資料邏輯的操作語言,針對資料操作思維設計,相對於程式邏輯思維的語言,相對的較容易操作與學習,不用處理和電腦硬體內部相關的細節。 ### 資料定義語言DDL、資料操作語言DML #### DDL(Data Definition Language) * 用來定義資料庫、資料表、檢視表、索引、預存程序、觸發程序、函數等資料庫物件。用來建立、更新、刪除表格(Table)、Schema、Domain、Index、View。 * CREATE 建立資料庫的物件。 * ALTER 變更資料庫的物件。 * DROP 刪除資料庫的物件。 #### DML(Data Manipulation Language) * 用來處理資料表裡的資料。 * INSERT 新增資料到資料表中。 * UPDATE 更改資料表中的資料。 * DELETE 刪除資料表中的資料。 ### 資料控制語言DCL、資料查詢語言DQL #### DCL(Data Control Language) * 用來控制資料表、檢視表之存取權限,提供資料庫的安全性。 * GRANT 賦予使用者使用權限。 * REVOKE 取消使用者的使用權限。 * COMMIT 完成交易作業。 * ROLLBACK 將已變動的資料回復到交易開始的狀態。 #### DQL(Data Query Language) * 負責進行資料查詢,不會對資料本身進行修改的語句。 * SELECT 選取資料庫中的資料。 * SELECT,FROM,WHERE,GROUP BY,ORDER BY。 ### 常見SQL語法範例 #### 註解: * (兩個減號代表此行為註解) #### 建立表格:CREATE * Create table aiot (id int, name text); * 包含 id,name 兩個欄位,id 為數值,name 為字串 #### 新增資料:INSERT * Insert into aiot values (1, ‘Temperature’); * 新增一筆資料至 aiot 表格,id 等於 1,name等於Temperature #### 刪除資料:DELETE * Delete from aiot where id=1; * 刪除 aiot 表格內 id 等於 1 的資料。 #### 更新資料:UPDATE * Update aiot set id=2 where name=‘Temperature’; * 更新 aiot 表格內的資料,id 等於 2,將name內容設定新的值為 Temperature。 #### 查詢資料:SELECT (使用where篩選條件) * Select * from aiot; 查詢 aiot 內所有的資料。 * Select * from aiot where id=1; 查詢 aiot 內 id 等於1的資料。 * Select * from aiot where name = ‘Temperature’; 查詢 aiot 內 name 等於 Temperature 的資料。 * Select * from aiot where name like ‘Tem%’; 查詢 aiot 內 name 包含 Tem 字串開頭的資料。 ### PostgreSQL資料庫介紹 * PostgreSQL 官方的網站為:https://www.postgresql.org/ * PostgreSQL 目前最新的版本為第12版,提升了大數據集中的整體儲存使用空間利用率,為應用程序開發人員提供更多的功能,例如SQL / JSON路徑表達式的支持,優化公共表達式(WITH查詢)的執行,以及對生成列的支持等。 * PostgreSQL 使用 PostgreSQL 許可證發行方式,類似BSD的“寬鬆”許可證。OSI 認證的許可證,對企業是友善的,不限制在商業和專有的程式系統中使用 PostgreSQL,同時有許多公司支援維護,達成程式碼公共所有權,PostgreSQL 非常受希望將資料庫包含在自己公司產品中的供應商歡迎,不必擔心費用、供應商鎖定等許可條款的情形。 ### 關聯式資料庫-正規化 正規化(Normalization)是關聯式資料庫在設計資料表時,用來消除資料儲存異常的處理方法。正規化的主要工作,將每個表單簡化到只描述一種事實,避免資料重複浪費儲存,並消除資料之間矛盾的情況,使資料庫運作起來更有效率,維護上也更容易。 #### 第一正規化(1NF)-確定主鍵 * 1NF 確認資料表中的主鍵。主鍵是辨識每筆資料的關鍵欄位,主鍵並不侷限只能有單一欄位,也能由多個欄位共同構成,之後讓每個欄位都只儲存一筆資料,最後要確認表單內所有的欄位,都要與主鍵有關係,稱為相依性。完成後即完成 1NF 的水果訂單。 #### 第二正規化(2NF)-消除重複欄位 * 2NF 除了要符合1NF之外,還要消除部分相依(Partial Dependency),減少資料重複和不一致性。在多重主鍵的情況下,有些資料只跟部分主鍵有直接關係,而不是跟每個主鍵都有關聯。基本上,經過1NF且主鍵僅有單一欄位的資料表,就能符合 2NF 的規範。 #### 第三正規化(3NF)-將非主鍵決定的欄位獨立成新表單 * 3NF 除了要滿足前面兩個正規化,還要消除資料表中的遞移相依(Transitive Dependency)。遞移相依是資料表單中,有些欄位資料內容,在一張表單裡面,可以由某一個「不是主鍵」的欄位決定,像我們在完成 2NF 的表單中,客戶名稱這個欄位,其實是由客戶編號決定的,而不是訂單編號,因此需要執行第三正規化。 完成上述步驟後,水果訂單就能符合 3NF 的規範,而經過這些處理後,該表單也就完成了資料表的正規化。 ### NoSQL 資料庫介紹 * NoSQL 資料庫使用多種資料模型存取及管理資料。放寬傳統關聯式資料庫的資料一致性限制,針對需要大量資料、低延遲和彈性資料模型的應用程式進行優化,資料通常儲存為 JSON 文件。 * NoSQL 資料庫整體而言提供促進更快速及更能反覆開發的彈性結構描述,具彈性的資料模型讓 NoSQL 資料庫成為半結構和非結構式資料的理想資料庫。 * NoSQL 資料庫能透過硬體的分散式叢集來向外擴展,不必藉由增加昂貴的伺服器來進行垂直擴展,比使用關聯式資料庫達到相同功能的更高效能模式。 ### NoSQL 資料庫類型 * 鍵值:鍵值資料庫具備高度可分割性,允許其他類型資料庫無法達到的大規模橫向擴展,IoT 使用案例特別適合鍵值資料模型。 * 文件:資料可以表示為物件或類似 JSON 的文件,因為它對於開發人員是容易處理且直覺的資料模型。 * 文件資料庫讓開發人員,用應用程式程式碼中相同的文件模型格式,更輕鬆地儲存和查詢資料庫中的資料。 * 在 NoSQL 資料庫中,透過 JSON 半結構化和分層化的特性,快速的儲存目錄、使用者設定檔等訊息,同時NoSQL資料庫中每個文件資料都是唯一的,隨著時間的遷移快速儲存更新的版本。 ### NoSQL 開源資料庫介紹 #### Apache Hadoop * Hadoop 是根據 Google 公司發表的 MapReduce 和 Google 檔案系統的論文由 Apache 自行實作而成。 #### Apache Cassandra * 開源分散式 NoSQL 資料庫系統,最初由Facebook開發,改善電子郵件系統搜尋效能的簡單格式資料,含有 Google BigTable 的資料模型與 Amazon Dynamo 的完全分散式架構。 #### Apache CouchDB * 開源資料庫,專注於易用性和成為"完全擁抱web的資料庫"。使用 JSON 作為儲存格式,JavaScript 作為查詢語言,MapReduce 和 HTTP 作為 API 的文件導向的 NoSQL 資料庫。 #### MongoDB * MongoDB 是一種文件導向的資料庫管理系統,2009 年 2 月首度推出,現以伺服器端公共許可分發。 ### JSON 文件格式介紹 * JSON 是依照 JavaScript 物件語法的資料格式,雖然 JSON 是以 JavaScript 語法為基礎,但可獨立使用,且許多程式設計環境亦可讀取 (剖析) 並產生 JSON。 * JSON會以物件或字串的形式呈現,想從 JSON 中讀取資料時,JSON 可作為物件,當要跨網路傳送 JSON 時,會先將 JSON 物件轉換成字串來傳送。 * JSON 物件副檔名為 .json 的文字檔案,以及 application/json 的 MIME type。JSON 是純粹的資料格式 — 僅具備屬性,無函式定義。 * JSON 需要雙引號。單一個逗號或冒號放錯位置,會讓 JSON 檔案出錯而無法運作,仔細檢查所有要使用的資料 (只要產生器程式能正確運作,由電腦產生的 JSON 不容易出錯),可以用 JSONLint 應用程式檢查 JSON 正確性。 * 不限於陣列或物件,只要是符合標準 JSON 物件形式的任何資料,都可以夾帶進 JSON 檔案中。 ### JSON文件範例 ![](https://i.imgur.com/f9ZEZDH.png) ### SQL資料庫總結 #### 優點 * 單元性、一致性、隔離性、持續性(Atomicity、Consistency、Isolation、Durability,ACID)標準符合性。ACID 標準符合性透過精確建議交易與資料庫互動,減少異常資料的發生,保護資料庫的完整性。 * 資料以結構化的方式組織,可以更輕鬆地使用資料,為了方便日後資料的維護與操作,務必保留最新的資料表格欄位與表格關係圖(ER模型)。 * RDBMS 工具已經投放市場多年,市面上已經有各種商業產品,如MySQL、Microsoft SQL Server、Oracle、DB2等,而開放原始碼的版本,如postgreSQL提供了穩定且廣泛的文件。 * RDBMS 要注意的是隨著資料庫資料的增長,當需要擴展時,會需要用使用某些技術,如分散式資料庫,但這些技術於實務上不容易實施。 * 某些資料庫存在著單一資料庫最大儲存大小的檔案限制。 ![](https://i.imgur.com/jBJpSXR.png) 補充資料: [Navicat Monitor for MySQL/MariaDB](https://https://navicat.com/cht/products/navicat-monitor) --- ### 知識點回顧 * 市面上有許多的形式的資料庫系統,技術上資料庫操作分為 SQL 與 NoSQL 兩種形式。 * SQL 是資料庫系統操作的一個標準語言,主要目的在讓使用者可以針對資料操作的邏輯與動作來設計,讓傳統的程式語言與資料操作脫鉤,可以讓使用者在不懂程式語言的情況下,透過 ANSI SQL 標準的結構化資料操作語言,進行資料庫中資料的新增、修改、刪除、查詢等方式進行資料操作,擺脫特定程式語言升級後資料操作維護的困擾。 * NoSQL 的資料儲存操作系統日趨成熟且普遍,面對日趨龐大的數據資料的情形下,使用 NoSQL 提升數據資料的讀取速度,特別是在隨時間不斷連續增加的歷史紀錄的資料,NoSQL 在業界已被大量採用。 --- ### 參考資料 #### SQL Tutorial 網站:[w3schools](https://www.w3schools.com/sql/default.asp) 坊間有許多SQL語法以及範例的教材網站,對於SQL語法有興趣學習,但是沒有時間太深入研究的使用者,可以透過 w3schools.com 的教材來學習基礎的SQL語言操作,以及後續的資料庫程式設計。 ![](https://i.imgur.com/SQnyROF.png) #### PostgreSQL: The World's Most Advanced Open Source Relational Database 網站:[PostgreSQL](https://www.postgresql.org/) PostgreSQL 是超過30年以上發展的SQL資料庫,永遠免費且完全開放原始碼,經過了多年的發展,有著各種程式語言的支援函式庫,同時各種效能調整文件非常齊全,對於 Java、Python、PHP、C語言的連接與程式開發支援也非常完整,對於 OpenGIS 也有 PostGIS 空間資料庫支援。 ![](https://i.imgur.com/ktzF3Bh.png) #### 為何使用資料庫儲存資料時,需要先執行正規化? 網站:[iThome](https://www.ithome.com.tw/node/47440) 正規化的主要工作,就是要調整事實描述方式,將每個表單簡化到只描述一種事實,好讓資料井井有條得存放在電腦中,避免資料重複浪費儲存。 ![](https://i.imgur.com/d05rTe0.png) #### 24個免費、商業的SQL和NoSQL主流雲資料庫大觀 網站:[kknews](https://kknews.cc/zh-tw/tech/mmmkypz.html) 雲資料庫在雲計算平台上運行,並且有兩個常見的部署模型,其中一個可以使用虛擬機映像來實現,用戶可以獨立地在雲上運行資料庫。另一個選項是購買對由雲資料庫提供者維護的資料庫服務的訪問。雲中的一些雲資料庫是基於SQL的,一些使用NoSQL數據模型。 ![](https://i.imgur.com/tm6xr5M.png) #### Introducing JSON 網站:[JSON](https://www.json.org/json-en.html) JSON(JavaScript對象表示法)是一種輕量級的數據交換格式。使人易於閱讀和撰寫,同時讓機器容易創造與解析,是根據JavaScript語言標準ECMA-262第三版(1999年12月)的子集發展。 JSON是一種文件格式,完全獨立於程式語言,但使用C語言家族(包括C)的程序員熟悉的約定, C ++,C#,Java,JavaScript,Perl,Python等。這些屬性使JSON成為理想的資料描述、數據交換語言。 ![](https://i.imgur.com/fE3Nn2v.png) #### 使用 JSON 資料 網站:[DEVELOPER](https://developer.mozilla.org/zh-TW/docs/Learn/JavaScript/Objects/JSON) JavaScript Object Notation (JSON) 為將結構化資料 (structured data) 呈現為 JavaScript 物件的標準格式,常用於網站上的資料呈現、傳輸 (例如將資料從伺服器送至用戶端,以利顯示網頁)。你應該會常常遇到,因此本文將說明 JavaScript 搭配 JSON 時所應知道的觀念,包含如何在 JSON 物件中存取資料項目,並寫出你自己的 JSON。 ![](https://i.imgur.com/wTNduJS.png) MongoDB 學習筆記 (一) : 在 Win10 上安裝 MongoDB 網站:[Blogger小狐狸事務所](http://yhhuang1966.blogspot.com/2019/01/mongodb-win10-mongodb.html) MongoDB 是以 Javascript 當作腳本語言且以 JSON 儲存資料 (嚴格來說是 Binary JSON) 的 NoSQL 資料庫, 為 10gen 團隊於 2007 年開始發展, 與 Node.js 搭配使用非常方便 (資料不須轉換直接交換). 它支援 Map/Reduce 功能, 可用於大數據資料處理. 除了在操作時使用 Javascript 讀寫資料庫, 還支援伺服端 Javascript 腳本, 相當於傳統關聯式資料庫的預儲程式功能。 ![](https://i.imgur.com/10FzM7e.png)