跳轉到內容

資料庫基礎:關係型資料庫

來自 Wikibooks,開放世界中的開放書籍


試卷 2 - ⇑ 資料庫基礎 ⇑

← 概念資料模型和實體關係建模 關係型資料庫 資料庫設計和規範化技術 →


什麼是關係型資料庫?

[編輯 | 編輯原始碼]

關係型資料庫是一種儲存資料的方法,我們根據特定的結構對資料進行劃分,這些結構之間存在著聯絡。

想象一下,一個關係型資料庫被獸醫使用。資料將被劃分成,每個表代表一個實體或“事物”。

實體 - 專案的類別,例如動物、客戶


獸醫護理的所有動物的詳細資訊將儲存在動物表中,獸醫使用的不同藥物的詳細資訊將儲存在藥物表中,等等。

資料庫還對實體之間的關係進行建模。在獸醫示例中,我們有客戶動物的表。每個客戶可能擁有一個(或多個)動物,每個動物屬於一個客戶,因此這兩個表中的記錄之間存在聯絡。

- 儲存有關給定實體的所有資料的結構,即表是在資料庫中表示實體的方式


表由列和行組成,可以想象成與我們想象的電子表格相同格式。


練習:選擇表

列出儲存有關足球聯賽的資料庫可能需要的表

答案

Team
Player
Match
Stadium
Referee

列出記錄線上商店詳細資訊可能需要的表

答案

Staff
Products
Receipts
Customers


每列代表一個屬性,它是我們想要儲存有關此特定表所代表的實體的資料的標記元素。以下是一些實體和這些實體可能具有的屬性示例

Animal: Name, Weight, IsNeutered
Customer: First name, Last name, Address, Post code

建立表時,將指定每個屬性的資料型別。這允許資料庫軟體分配足夠的記憶體來儲存任何可能輸入的資料,以及使其能夠對資料執行型別檢查。例如,在我們的動物表中,我們可能有以下屬性

屬性 資料型別
名稱 文字
重量 實數
是否絕育 布林值

表中的每一行代表一個實體的單個例項,稱為記錄。例如,在動物表中,我們可能有丘巴卡犬、塔比莎貓和珀西魚的行,它們都是動物的例項。

名稱 重量 動物型別 ...
丘巴卡 8
塔比莎 3
珀西 0.25
練習:選擇屬性

對於社交網站,您會在人員表中包含哪些屬性和資料型別

答案

Name: string
Date of Birth: Date
Gender: string (character might also work here)
Public profile: boolean
Personal description: String

對於社交網站,您會在關係表(儲存“朋友”、“姐妹”、“父親”等的表)中包含哪些屬性和資料型別

答案

Person1 ID: integer
Person2 ID: integer
Type of relationship: string
Date created: Date


關係型資料庫中的每個記錄都必須有自己的唯一主鍵 (PK) 屬性,它提供了一種在整個表中的所有記錄中識別特定記錄的方法。

主鍵 (PK) - 唯一標識資料庫表中記錄的屬性。


必須仔細選擇鍵屬性,以確保它真正唯一。例如,我們不能選擇屬性“名稱”作為我們動物表的主鍵,因為極有可能兩隻帶到獸醫處的動物會有相同的名稱。

確保唯一主鍵欄位的一種常見方法是允許資料庫軟體在新增新記錄時自動生成下一個整數序列。主鍵屬性通常命名為<TableName>ID(在本例中為Animal_ID),雖然這不是強制性的。

Animal_ID 名稱 重量 動物型別 ...
1 丘巴卡 8
2 塔比莎 3
3 珀西 0.25

在速記中編寫表設計時,主鍵欄位通常寫在最前面並帶下劃線

TableName(PrimaryKey, Attribute, Attribute, Attribute, Attribute)
Animal(Animal_ID, Name, Weight, TypeOfAnimal)

或者,在實體關係圖中,主鍵可以由 * 表示

Animal_ID*
Name
Weight
TypeOfAnimal

示例:選擇主鍵

讓我們看一個犯罪表中的示例

表:犯罪
屬性
國民保險號碼:字串
姓名:字串
出生日期:日期
傷疤數量:整數
家鄉:字串

這些資料項中的哪一項是唯一的?

屬性 唯一 原因
家鄉 你可能會有多個住在同一個城鎮的罪犯
傷疤數量 你可能會有兩個有相同傷疤數量的罪犯
出生日期 你可能會有兩個出生在同一天的罪犯,或者 雙胞胎都是罪犯
名稱 你可能會有兩個同名的罪犯。例如 約翰·史密斯約翰·史密斯
國民保險號碼 這對每個人來說都是唯一的

然後我們可以將表寫成

Criminal(NI Number, Name, Date of Birth, Number of scars, Home town)

組合主鍵

[編輯 | 編輯原始碼]

有時,多個屬性組合在一起用作鍵,而不是單個屬性。只有在屬性組合在一起時才能保證唯一性。例如,在有關酒店預訂的表中,可以透過組合房間號屬性和住宿開始日期屬性來建立組合鍵。不可能對同一房間在同一天進行兩次不同的預訂,因此該組合鍵唯一標識每個記錄。

房間號 開始日期 客人數量
8 2016 年 4 月 24 日 2
2 2016 年 5 月 12 日 1
8 2016 年 7 月 6 日 2

房間號本身不足以用作唯一識別符號,因為有很多預訂是針對同一個房間的。開始日期本身也不足以用作唯一識別符號,因為有很多預訂是在同一天開始的。


示例:選擇組合鍵

看一下這個有關房子的示例

表:房屋
編號:整數
道路:字串
顏色:字串
郵政編碼:字串
屬性 唯一 原因
編號 你可能在倫敦路和曼徹斯特路都有一個 61 號
道路 你可能在同一條路上有多棟房子
顏色 不止一棟房子可能是綠色的
郵政編碼 多棟房子可能擁有相同的郵政編碼

我們可以建立一個主鍵,但如果你仔細觀察,我們可以使用多個屬性的組合。房屋編號和道路名稱組合在一起似乎是唯一的。你不可能有兩棟 45 號貝爾蒙特街,對吧?

房屋(編號, 道路, 顏色, 郵政編碼)

聽起來可以嗎?如果我們儲存關於全國所有城鎮的資料,並且曼徹斯特有一個 5 號倫敦路,溫徹斯特也有一個 5 號倫敦路。這意味著組合不是唯一的。我們可以嘗試使用房屋編號和郵政編碼,這種組合總是唯一的,這就是我們的組合鍵

房屋(編號, 道路, 顏色, 郵政編碼)


練習:鍵

在以下表屬性中找出主鍵,並寫出表設計

表:汽車
登記號碼:字串
顏色:字串
車門數量:整數
敞篷車:布林值

答案

Car(Registration number, Colour, Number of doors, Convertible)

在以下表屬性中找出主鍵

表:學生記錄
姓名:字串
唯一學習者編號:整數
出生日期:日期
手機號碼:整數

答案

Student(Unique Learner Number, Name, Date of Birth, Mobile number

不是手機號碼,因為他們可能與其他人共用一部手機。

在適用的情況下,使用組合鍵、主鍵重新編寫表描述,或為以下表新增主鍵
收據(客戶ID, 日期時間, 總計, 員工ID)

答案

收據(客戶ID, 日期時間, 總計, 員工ID)

Match(TeamA, TeamB, Date, TeamAScore, TeamBScore, RefID)

答案

Match(TeamA, TeamB, Date, TeamAScore, TeamBScore, RefID)

Phone(ModelID, Colour, Weight, Internet)

答案

Phone(ModelID, Colour, Weight, Internet)

你可能會爭辯說,如果這是針對特定手機例項而不是手機型號,則需要透過序列號等引入唯一值

Cat(Colour, Weight, NumberofLegs, Name)

答案

這裡沒有足夠的欄位讓我們找到一個唯一的欄位或組合。 我們可能有兩個叫做Phil的體重為1公斤、有三條腿的薑黃色貓。 因此,我們需要引入一個新的唯一值,CatID Cat(CatID, Colour, Weight, NumberofLegs, Name)

外部索引鍵

[edit | edit source]
外部索引鍵 (FK) - 表中的一個欄位,對應於另一個表的主鍵欄位


外部索引鍵用於將錶鏈接在一起並在表之間交叉引用。 例如,這是我們獸醫示例中的Animal表,添加了Owner_ID外部索引鍵

Animal_ID 名稱 重量 動物型別 Owner_ID ...
1 丘巴卡 8 2
2 塔比莎 3 2
3 珀西 0.25 6

Owner_IDAnimal表中的外部索引鍵,因為它也是Owner表中的主鍵

外部索引鍵可用於查詢所有者的任何其他屬性,因為它對應於Owner表中的Owner_ID,它是主鍵,因此保證引用其中的一條記錄。

華夏公益教科書