阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈

資料庫是當今(幾乎)每個軟體的重要組成部分。在這篇文章中,我將告訴您開始與他們合作所需了解的一切。

什麼是資料庫?

如果您管理文件或資料夾中的訊息,您遲早會發現:

  • 您有多個包含相同資訊的文件

  • 您有多個關於相同主題但資訊不同的文件,因此很難理解哪個文件具有正確/更新的資訊。

  • 每次您想要更改某些資訊時,您都必須更新多個文件,這會花費大量時間,並且可能會出現導致前兩個問題的錯誤。

這種處理資訊的方法效率低下,資料庫就是為了解決這些問題而建立的。

資料庫是一個允許每個人共享、管理和使用資料的系統。要使用它,您首先需要了解一些事情:

  • 很多人都會使用它,所以你必須找到一種讓他們輕鬆輸入和提取資料的方法。

  • 資料庫還存在用戶竊取或覆蓋重要資訊等風險,因此在設計資料庫時應考慮安全性和權限。

  • 您還需要小心不要遺失任何資料。系統可能會崩潰或硬碟可能會故障。資料庫需要從這種故障中恢復的機制。

資料庫類型

資料庫有很多種,這三種是資料庫最常用的資料模型:

  • 分層資料模型,其中資料之間存在樹狀關係。

  • 網路資料模型,其中資料區塊彼此之間存在重疊關係。

  • 關係資料模型,使用易於理解的表概念來處理資料。

要使用分層資料模型和網路資料模型,您必須透過記住資料的實體位置和順序來管理資料,因此對資料執行靈活且高速的搜尋很困難。

這就是我們將使用關係資料模型的原因。

什麼是關係資料庫?

關係資料庫是資料庫的一種。它使用的結構允許我們辨識和存取與資料庫中另一個資料相關的資料。關係資料庫中的資料被組織成表。

表、記錄、欄位、行和列

  • 是一組資料元素(值)。

  • 文件中的一段資料稱為一筆記錄

  • 記錄中的每一項稱為欄位

表、記錄、欄位、行和列

  • 一筆資料或記錄稱為一行

  • 每個專案或欄位稱為一

主鍵、唯一鍵與空鍵

主鍵、唯一鍵與空鍵

欄位通常在資料庫中扮演重要角色,當發生這種情況時,我們將該欄位稱為主鍵。在此範例中,產品程式碼是主鍵。下一節將提供更多相關資訊。

唯一值是不能重複的值(與產品名稱一樣,不應有兩個具有相同名稱的產品)。

Null是沒有值(如上面「備註」所示,其中有空值)。某些欄位可以為空(取決於資料庫)。

鍵型別

  • :資料庫表中的一列或多列,用於對表中的行進行排序和/或標識。例如,如果您按薪水欄位對人員進行排序,那麼薪水欄位就是關鍵。

  • 主鍵:主鍵是唯一標識表中一行的一個或多個欄位。主鍵不能為空(空白)。主鍵已建立索引(稍後將詳細介紹索引)。

  • 外鍵:外鍵是兩個資料庫表(其中一個已建立索引)中的欄位之間的關係,旨在確保資料的一致性。

  • 複合鍵:由一列或多列組成的主鍵。主鍵可以使用欄位形成(儘管不太建議)。

  • 自然鍵:複合主鍵,由現實世界中已經存在的屬性(欄位)組成(例如名字、姓氏、社會保險號碼)。

  • 代理鍵:內部產生的主鍵(通常是自動遞增整數值),現實世界中不存在(例如,用於辨識記錄但僅用於辨識其他內容的 ID)。

  • 候選鍵:表中的一列或一組列,可以唯一標識任何資料庫記錄,而無需引用任何其他資料。每個表可能有一個或多個候選鍵,但其中一個候選鍵是唯一的(主鍵)。

  • 複合鍵:由兩個或多個欄位組成的複合鍵,這些欄位唯一地描述表中的一行。複合鍵和候選鍵的差異在於複合鍵中的所有欄位都是外鍵;候選鍵中的一個或多個欄位可以是外鍵(但這不是強制性的)。

設計資料庫

當您嘗試自己建立資料庫時,第一步是確定您嘗試建模的資料的條件。

ER 模型

用於分析製作圖表的模型。在此模型中,您使用實體和關係的概念來考慮現實世界。

  • E指實體。現實世界中可辨識的物件。例如,當向其他國家出口水果時,水果出口目的地可以被視為實體。用矩形表示。

  • 每個實體都有屬性,即描述該實體的特定屬性(例如,水果中的產品名稱)。以卵圓表示。

實體、屬性

  • R指的是關係。實體如何相互關聯。例如,水果和出口目的地相互關聯,因為您將水果銷售到出口目的地。以鑽石表示。

水果出口到許多出口目的地,出口目的地採購多種水果。我們稱之為多對多關係。在 ER 模型中,考慮實體之間關聯的數量,稱為基數

實體、屬性、關係、基數

  • 基數:實體之間的關聯數。

  • 一對一關係(1-1) :我只賣水果給你,你只買水果給我。

  • 一對多(或多對一)關係(n-1 或 1-n) :我向其他家庭出售水果,而這些家庭只向我購買水果。

  • 多對多關係(nn) :上面有一個例子。

正常化

按照一系列步驟將現實世界中的資料製成表格以建立關係資料庫的過程。為了正確管理關係資料庫,有必要對資料進行標準化。歸一化主要有兩個目的:

  • 消除冗餘(無用)資料。

  • 確保資料依賴性有意義,即資料是邏輯儲存的。

非標準化形式

第一範式是根據該表建立的。您為給定實體確定的所有屬性可能都以平面結構分組在一起。這就是規範化過程發揮作用的地方,以組織屬性。

第一範式

對於第一範式的表,應遵循以下 4 條規則:

  • 它應該只具有單(原子)值屬性/列:這意味著,例如,水果不應該在資料庫中具有兩個名稱。

  • 儲存在列中的值應該屬於同一域:這更多的是「常識」規則。每列中儲存的值必須具有相同的種類或類型。

  • 表中的所有列都應具有唯一的名稱:此規則要求表中的每一列都應具有唯一的名稱。這是為了避免在檢索資料或對儲存的資料執行任何其他操作時出現混亂。

  • 資料儲存的順序並不重要:此規則表示您在表格中儲存資料的順序並不重要。

重要的

在繼續之前,您必須先了解這一點:

  • 主要屬性:給定關係表的候選鍵的一部分。

  • 非素數屬性:不是候選鍵的一部分。

第二範式

  • 它應該是第一個範式。

  • 它不應該有部分依賴。如果關係的非主要屬性僅由複合候選鍵的一部分導出,則這種依賴關係被定義為部分依賴關係。

  • 依賴性:當您必須使用主鍵才能取得特定值時(例如,透過您的Name來了解您的Age )。

第三範式

  • 它是第二範式。

  • 它沒有傳遞依賴。如果關係的非主要屬性是透過另一個非主要屬性或候選鍵的一部分與非主要屬性的組合派生的,那麼這種依賴性將被定義為傳遞依賴性。

設計資料庫的步驟

現在您已經熟悉了基本術語和 ER 模型,您就可以設計資料庫了。

  1. 確定資料庫的用途。

  2. 確定所需的表。

  3. 確定所需的欄位。

  4. 確定專屬字段。

  5. 確定表之間的關係。

  6. 定義約束以保持資料完整性(不要忘記標準化)。

SQL

當您使用資料庫時,您必須使用 SQL(結構化查詢語言)輸入或檢索資料。 SQL 可讓您與資料庫通訊。某些命令可能會根據您使用的資料庫管理系統(例如 SQL Server)而變更。

它的命令可以分為三種不同的類型:

  • 資料定義語言(DDL) :與資料結構相關。

  • 創造

  • 降低

  • 改變

  • 資料操作語言(DML) :與儲存的資料相關。

  • 選擇

  • 插入

  • 更新

  • 刪除

  • 資料控制語言 (DCL) :管理使用者存取。

選擇

最基本的 SQL 語句。

SELECT product_name /*The column you want to see...*/
FROM product; /*...from the table it belongs.*/

在哪裡

用於指定您想要的資訊。

此語句會擷取商品表中單價大於等於200的所有資料。

SELECT *     /*This selects every column in the table.*/
FROM product
WHERE unit_price>=200; /*Very easy to understand right?*/

這個檢索產品名稱為“apple”的所有資料。

SELECT *
FROM product
WHERE product_name=’apple’;

比較運算符

比較運算符

邏輯運算符

邏輯運算符

其他

SELECT *
FROM product
WHERE unit_price
BETWEEN 150 AND 200; /*Between doesn’t need explanation I think.*/
SELECT *
FROM product
WHERE unit_price is NULL; /*This one neither.*/

LIKE

當您不確切知道要搜尋什麼時,可以透過在 LIKE 語句中使用通配符來在條件中使用模式匹配。

通配符

例子:

SELECT *
FROM product
WHERE product_name LIKE "%n"; /*Will search for data ending with the letter ‘n’.*/

訂購依據

根據特定列對資料進行排序。

SELECT *
FROM product
WHERE product_name LIKE "%n"
ORDER BY unit_price; /*Easy to understand, right*/

SQL 中的聚合函數

也稱為集合函數。您可以使用它們來聚合訊息,例如最大值或最小值。

通配符

例子:

SELECT MAX(unit_price) FROM product

透過分組聚合資料

如果將資料分組,您可以輕鬆獲得聚合值。若要將資料分組,請結合聚合函數和 GROUP BY。

SELECT district, AVG(unit_price)
FROM product
GROUP BY district; /*Output: Average unit price per district*/

擁有

您不能將 WHERE 與聚合函數一起使用,而必須使用 HAVING。

SELECT district, AVG(unit_price)
FROM product
GROUP BY district;
HAVING AVG(unit_price)>=200; /*Filters result after being grouped.*/

搜尋資料

SQL中有更複雜的查詢方法。

子查詢和IN

您可以將一個查詢嵌入到另一個查詢中(這稱為子查詢)。

SELECT *
FROM product
WHERE product_code
IN (
SELECT product_code
FROM sales_statement
WHERE quantity>=1000
);

首先執行括號中的查詢。另一個 SELECT 是根據結果執行的。 IN 運算子允許多個 WHERE 值(這就是為什麼第一個選擇與第二個選擇一起使用的原因)。

關聯查詢

子查詢可以引用外部查詢中的資料,稱為相關查詢。

SELECT *
FROM sales_statement U /*Alias? Maybe more on this later*/
WHERE quantity>
(
SELECT AVG(quantity)
FROM sales_statement
WHERE product_code=U.product_code
);

別名

SQL 別名用於為資料表或表格中的欄位提供暫存名稱。通常用於縮短列名稱,以便更輕鬆地使用它們(主要是在聯結中)。別名僅在查詢期間存在。

SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName="Around the Horn" AND c.CustomerID=o.CustomerID;

連接表

JOIN 用於根據兩個或多個表之間的相關欄位來組合兩個或多個表中的行。

不同類型的 SQL JOIN

以下是 SQL 中 JOIN 的不同類型:

  • (INNER) JOIN:傳回兩個表中具有符合值的記錄。

內連接

  • LEFT (OUTER) JOIN:傳回左表中的所有記錄,以及右表中符合的記錄。

內連接

  • RIGHT (OUTER) JOIN:傳回右表中的所有記錄以及左表中符合的記錄。

內連接

  • FULL (OUTER) JOIN:當左表或右表中有匹配項時傳回所有記錄。

內連接

等值連接

根據關聯表的相等或匹配列值進行聯接。等號 (=) 在 where 子句中用作比較運算子來引用相等性。

SELECT *
FROM table1 
JOIN table2
[ON (join_condition)]
/*You can also do it without JOIN*/
SELECT column_list 
FROM table1, table2....
WHERE table1.column_name =
table2.column_name; 

建立表

根據您使用的資料庫類型,程式碼可能會有所不同。

CREATE TABLE product /*This line needs no explanation, right?*/
(
product_code INT NOT NULL,
product_name VARCHAR(255),
unit_price INT,
PRIMARY KEY(product_code)
);
  • INT 表示整數。

  • VARCHAR 表示資料庫需要文字。 255 表示不超過 255 個字元。

表上的約束

防止資料衝突的表規範。

約束條件

將資料插入表中

INSERT INTO product (product_code, product_name, unit_price)
VALUES (101, "melon", 800);
INSERT INTO product VALUES (101, "melon", 800);

兩個語句的作用相同。您可以按照定義的類型和順序插入資料。記住約束(例如主鍵)。

更新行

允許您修改表內的資料。

UPDATE product
SET product_name="cantaloupe"    /*New value*/
WHERE product_name="melon";    /*Specific value to overwrite*/

刪除行

從表中刪除資料。

DELETE FROM product
WHERE product_name="apple"; /*Row to delete*/

建立視圖

您可以建立僅在使用者檢視時才存在的虛擬表。這是一個觀點。派生視圖的表稱為基底表。

CREATE VIEW expensive_product /*The view name is "expensive_product"*/
(product_code, product_name, unit_price)
AS SELECT *
FROM product
WHERE unit_price>=200;

若要使用視圖:

SELECT *
FROM expensive_product
WHERE unit_price>=500;

當您想要將表中的部分資料公開時,建立視圖會很方便。

降低

允許您刪除:

/*A view:*/
DROP VIEW expensive_product;
/*A base table:*/
DROP TABLE product;
/*A database:*/
DROP DATABASE name;

操作資料庫

交易

資料操作的單位稱為事務。範例:讀取資料、寫入資料。交易總是以提交回滾操作結束。

確保可以處理多個事務而不發生資料衝突非常重要。在處理事務時發生故障時,防止資料不一致也很重要。為此,下表列出了事務所需的屬性,即 ACID。

交易所需的屬性

交易所需的屬性

COMMIT

當每一個事務都被正確處理時,資料庫中的操作就完成了。此終結稱為提交操作。

控制多個使用者的操作,保證並發存取資料庫時不會出現問題。為此,使用了一種稱為Lock的方法。

您可以鎖定資料以防止其被錯誤處理。

如果我對資料庫執行某些操作,資料將被鎖定,直到我的操作完成,然後解鎖以供另一個使用者使用,資料再次鎖定,並在該使用者完成時解鎖。

儘管鎖在資料庫中具有其自身的作用,但不應該過度使用它,因為它會阻礙其目的:與許多人共享資料。所以我們根據情況使用不同類型的鎖。

共享鎖

例如,當讀取操作是唯一需要的操作時,您可以使用共用鎖定。其他使用者可以讀取資料,但不能對其執行寫入操作。

專屬鎖

執行寫入操作時,使用者套用排他鎖。應用後,其他用戶無法讀取或寫入資料。

並發控制

當鎖用於控制兩個或多個事務時。並發允許盡可能多的使用者同時使用資料庫,同時防止資料衝突發生。

兩相鎖定

為了確保調度是可序列化的,我們需要遵守設定和釋放鎖的特定規則。這些規則之一是兩階段鎖定,對於每個事務,應使用兩個階段:一個用於設定鎖,另一個用於釋放鎖。

鎖定粒度

有許多資源可以被鎖定。資源被鎖定的程度稱為粒度。當同時鎖定許多資源時,會出現粗粒度;鎖定很少的資源時,會出現細粒度。當粒度較粗(或較高)時,每個事務所需的鎖數量就會減少,從而減少所需的處理量。

其他並發控制

當事務數量較少或讀取操作數量較多時,可以使用較簡單的方法。

  • 時間戳控制:包含存取時間(時間戳記)的標籤被指派給事務期間存取的資料。如果時間戳較晚的另一個事務已經更新了資料,則不允許該操作。當不允許讀取或寫入操作時,事務將回滾。

  • 樂觀控制:此方法允許讀取操作。當嘗試寫入操作時,將檢查資料以查看是否發生了任何其他事務。如果另一個事務已經更新了資料,則回滾該事務。

隔離等級

您可以設定可以並發處理的事務級別,稱為隔離級別。 SET TRANSACTION 語句可用來指定下列交易的隔離等級:

  • 未提交的閱讀

  • 已提交讀

  • 可重複閱讀

  • 可串列化

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

根據隔離等級設置,可能會發生以下任一操作:

隔離

  • 髒讀:當事務2讀取事務1之前的一行。

  • 不可重複讀:當一個事務兩次讀取相同的資料並得到不同的值。

  • 幻讀:當一個事務搜尋符合特定條件的行,但由於另一個事務的變更而找到錯誤的行。

僵局

兩個用戶在兩個表上使用排他鎖。然後,兩者都會嘗試對另一個表套用相同的鎖。由於他們每個人都必須等待另一個用戶申請的鎖被釋放,所以他們都不能進行任何操作。這種情況稱為死鎖,除非釋放其中一個鎖,否則無法解決。

復原

當發生死鎖時,您可以尋找已排隊一定時間的事務並取消它們。取消交易(其中的每個操作)稱為回滾。例如,如果您想對價格為 150 或以上的所有水果應用折扣,而其中一個失敗,則您會取消所有內容,並且資料庫的行為就像未執行任何操作一樣。

資料庫安全

如果您不保護資料庫,資料可能會在未經許可的情況下被刪除或修改。一個好的解決方案可能是要求使用者名稱和密碼來限制使用者並限制對某些使用者的操作(例如,只有管理員可以 DROP 一個表)。

授予

您可以使用 GRANT 向使用者授予存取權限。

GRANT SELECT, UPDATE ON product TO Overseas_business_department;

資料庫權限

特權

使用WITH GRANT OPTION 授予權限使用戶能夠授予其他使用者權限。

GRANT SELECT, UPDATE ON product TO overseas_business_department WITH GRANT OPTION;

撤銷

若要取消使用者的權限,請使用REVOKE

REVOKE SELECT, UPDATE ON product FROM overseas_business_department;

某些資料庫產品可以將多個權限分組並同時授予多個使用者。分組使權限管理更加容易。使用視圖可以提高安全性,並向某些使用者啟用視圖,您也可以保護視圖中的選取資料。

災難復原

資料庫需要有一種機制,可以在發生故障時保護系統中的資料。為了確保交易的持久性,任何故障都不能建立不正確或錯誤的資料。為了保護自身免受故障影響,資料庫執行各種操作,其中包括建立備份和交易日誌

每當執行資料操作時,都會保留稱為日誌的記錄。當系統出現問題時,您會先重新啟動系統並利用日誌來還原資料庫。恢復方法會根據交易是否已提交而有所不同。

故障類型

  • 交易失敗:當交易因本身的錯誤而無法完成。當發生此故障時,事務將回滾。

  • 系統故障:當系統因電源故障或其他中斷而停機時。

如果問題發生在交易提交之後,您可以透過對資料庫重新套用操作來還原資料。這種方法稱為前滾。

如果交易尚未提交,則會發生回溯。參考更新前的值來取消交易。

  • 媒體故障:當包含資料庫的硬碟損壞時。

檢查站

為了提高資料庫寫入操作的效率,經常使用緩衝區(用於暫時保存資料的記憶體段)來短期寫入資料。緩衝區的內容和資料庫同步,然後寫入檢查點。當資料庫寫入檢查點時,它不必對檢查點之前提交的事務執行任何故障復原。必須恢復在檢查點之前未提交的事務。

索引

隨著資料庫的成長和越來越多的人開始使用它,可能會出現一些問題。資料量越大,搜尋操作就越慢。

索引的作用就像在書中一樣。盲目搜尋書中的某個資訊會花費時間,因此您檢查索引以加快搜尋速度。當搜尋某些資料時,瀏覽所有行是非常耗時的。如果您為產品程式碼建立索引,您可以立即了解指派的產品的產品資料儲存位置。它告訴您磁碟上的位置,減少磁碟造訪次數,從而加快未來的搜尋速度。

新增索引由資料庫管理員決定。建立太多索引可能會導致效率低下(想像一本書中有大量索引,不會有任何好處)。

儲存程式

類型

特權

資料庫伺服器內部的程式邏輯(基本上是伺服器內部的查詢)。它們有助於減少網路負載,因為它消除了頻繁傳輸 SQL 查詢的需要。

分散式資料庫

一種資料庫,其中並非所有儲存裝置都連接到公共處理器,而是位於位於相同實體位置或分散在互連電腦網路上的多台電腦中。請記住,它可以作為單一資料庫進行處理。

實踐

  • W3Schools 有許多基本的 SQL 練習,練習一下

  • W3Resources 有各種各樣的練習供您提陞技能

  • 《資料庫漫畫指南》包含練習及其答案,不僅包括 SQL,還包括設計階段的練習。

  • 也可以嘗試 Google 或 YouTube。

來源

感謝您的閱讀。不要忘記在 dev.to 和 Twitter 上關注我!


原文出處:https://dev.to/lmolivera/everything-you-need-to-know-about-relational-databases-3ejl


共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。

阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈