資料庫基礎:關係型資料庫
關係型資料庫是一種儲存資料的方法,我們根據特定的結構對資料進行劃分,這些結構之間存在著聯絡。
想象一下,一個關係型資料庫被獸醫使用。資料將被劃分成表,每個表代表一個實體或“事物”。
獸醫護理的所有動物的詳細資訊將儲存在動物表中,獸醫使用的不同藥物的詳細資訊將儲存在藥物表中,等等。
資料庫還對實體之間的關係進行建模。在獸醫示例中,我們有客戶和動物的表。每個客戶可能擁有一個(或多個)動物,每個動物屬於一個客戶,因此這兩個表中的記錄之間存在聯絡。
表由列和行組成,可以想象成與我們想象的電子表格相同格式。
|
練習:選擇表 列出儲存有關足球聯賽的資料庫可能需要的表 答案 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) 屬性,它提供了一種在整個表中的所有記錄中識別特定記錄的方法。
必須仔細選擇鍵屬性,以確保它真正唯一。例如,我們不能選擇屬性“名稱”作為我們動物表的主鍵,因為極有可能兩隻帶到獸醫處的動物會有相同的名稱。
確保唯一主鍵欄位的一種常見方法是允許資料庫軟體在新增新記錄時自動生成下一個整數序列。主鍵屬性通常命名為<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 |
房間號本身不足以用作唯一識別符號,因為有很多預訂是針對同一個房間的。開始日期本身也不足以用作唯一識別符號,因為有很多預訂是在同一天開始的。
|
示例:選擇組合鍵 看一下這個有關房子的示例
我們可以建立一個主鍵,但如果你仔細觀察,我們可以使用多個屬性的組合。房屋編號和道路名稱組合在一起似乎是唯一的。你不可能有兩棟 45 號貝爾蒙特街,對吧?
聽起來可以嗎?如果我們儲存關於全國所有城鎮的資料,並且曼徹斯特有一個 5 號倫敦路,溫徹斯特也有一個 5 號倫敦路。這意味著組合不是唯一的。我們可以嘗試使用房屋編號和郵政編碼,這種組合總是唯一的,這就是我們的組合鍵
|
|
練習:鍵 在以下表屬性中找出主鍵,並寫出表設計
答案 Car(Registration number, Colour, Number of doors, Convertible) 在以下表屬性中找出主鍵
答案 Student(Unique Learner Number, Name, Date of Birth, Mobile number 不是手機號碼,因為他們可能與其他人共用一部手機。 在適用的情況下,使用組合鍵、主鍵重新編寫表描述,或為以下表新增主鍵 答案 收據(客戶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]
外部索引鍵用於將錶鏈接在一起並在表之間交叉引用。 例如,這是我們獸醫示例中的Animal表,添加了Owner_ID的外部索引鍵
| Animal_ID | 名稱 | 重量 | 動物型別 | Owner_ID | ... |
|---|---|---|---|---|---|
| 1 | 丘巴卡 | 8 | 狗 | 2 | |
| 2 | 塔比莎 | 3 | 貓 | 2 | |
| 3 | 珀西 | 0.25 | 魚 | 6 |
Owner_ID是Animal表中的外部索引鍵,因為它也是Owner表中的主鍵。
外部索引鍵可用於查詢所有者的任何其他屬性,因為它對應於Owner表中的Owner_ID,它是主鍵,因此保證引用其中的一條記錄。