1.關系型數據庫
關系型數據庫(Relational Database,簡稱 RDB)是基于關系模型的一種數據庫,它通過表格的形式來組織和存儲數據。每個表由若干行(記錄)和列(字段)組成,數據通過行和列的交集進行關聯。常見的關系型數據庫管理系統(RDBMS)包括 MySQL、PostgreSQL、Oracle、SQL Server 等
2.數據庫中的關系是什么
在數據庫中,關系(Relation)是一個表的抽象概念。關系是數據庫中數據存儲的基本結構,它由若干 屬性(columns)和 元組(tuples,也稱為行)組成。
關系的定義:
關系 是一個由 元組(數據行)和 屬性(數據列)構成的集合。
每個關系對應數據庫中的一個表,每一行是一個元組(記錄),每一列是一個屬性(字段)。
在關系數據庫中,表就是一個具體的關系,表中的列對應屬性,表中的每一行對應元組。關系是一種數學上的概念,它遵循某些規則,用于組織和管理數據。
關系的特點:
元組(Tuple):表中的一行數據。在關系模型中,元組表示實體的一條記錄。例如,學生表中的一行數據記錄了一個學生的所有信息。
屬性(Attribute):表中的一列數據。每個屬性都有一個數據類型,定義了它可以存儲的數據值的種類。例如,學生表中“學號”、“姓名”、“年齡”就是屬性。
域(Domain):屬性的取值范圍,定義了屬性可以接受的數據類型。比如,“學號”屬性的域可能是整數類型,“姓名”屬性的域可能是字符串類型。
關系名:每個關系都有一個名稱,即表的名字。關系名是數據庫中關系的唯一標識。
關系的數學特性:
無序性:關系中的元組沒有順序,表中的行沒有排序要求。
元組唯一性:每個元組必須是唯一的,不能出現重復的行。
屬性無序性:關系中的屬性沒有順序,表中的列沒有排序要求。
舉個例子:
StudentID | Name | Age | Major |
---|---|---|---|
1001 | Alice | 20 | Computer Sci |
1002 | Bob | 21 | Computer Sci |
1003 | Charlie | 21 | Math |
在這個表中:
屬性(Attribute):StudentID、Name、Age、Major 是該表的屬性。
元組(Tuple):每一行數據都是一個元組,例如 (1001, Alice, 20, Computer Sci) 是表中的一個元組。
關系(Relation):表 Students 是一個關系,它由若干元組和屬性組成。
3.數據庫的關系模式
數據庫的關系模式(Relational Schema) 指的是一個關系數據庫中表的結構描述,包括表中的 屬性(columns)及其對應的 域(domain)。具體來說,關系模式定義了一個關系(即表)的名字、該關系的屬性名以及每個屬性可能的值的集合
詳細說明:
關系:通常是數據庫中的一個表(如學生表、訂單表等)。
屬性:即表中的列,每個屬性都有一個名稱,例如“學生姓名”、“學號”等。
域:每個屬性的可能取值范圍(例如,學號可能是一個整數,學生姓名可能是一個字符串)。域定義了該屬性允許的數據類型和取值限制。
關系模式的組成部分:
關系名:即表的名稱,如 Students。
屬性集:一組屬性,例如 StudentID、StudentName、Age。
屬性的域:每個屬性的取值范圍。例如,StudentID 的域可能是 整數,StudentName 的域是 字符串。
例如,假設有一個學生表 Students,其中包括 StudentID(整數類型),StudentName(字符串類型),Age(整數類型)。該表的關系模式可以表示為:
Students (StudentID: Integer, StudentName: String, Age: Integer)
這里:
Students 是關系的名稱。
StudentID, StudentName, Age 是表的屬性。
Integer 和 String 是這些屬性的域。
4.主碼
在數據庫中,主碼(Primary Key)是一個用于唯一標識一個表中每一行(記錄)的屬性(或屬性的組合)。主碼的值必須滿足兩個關鍵條件:
唯一性:表中的每一行必須具有唯一的主碼值,保證沒有兩行記錄的主碼相同。
非空性:主碼不能包含空值(NULL),每一行必須具有一個有效的主碼值。
主碼的作用:
唯一標識每一行:主碼是用來唯一識別表中的每一條記錄,它確保了每個數據行可以被獨立地區分和定位。
數據完整性:主碼通過保證唯一性和非空性,確保數據的完整性和一致性。
用于表間關聯:主碼通常用于建立與其他表的關聯,如通過外鍵(Foreign Key)將兩個表連接起來。
主碼的選取:
單屬性主碼:表中只有一個屬性作為主碼,如學生表中的學號(StudentID)。
復合主碼:當表中的單個屬性不足以唯一標識每一行時,可以使用多個屬性的組合作為主碼,這種主碼稱為復合主碼。例如,課程表中的一個復合主碼可能由 CourseID 和 Semester 組成。
舉例:
假設有一個學生表 Students,包含以下屬性:
StudentID | Name | Age | Major |
---|---|---|---|
1001 | Alice | 20 | Computer Sci |
1002 | Bob | 21 | Computer Sci |
1003 | Charlie | 21 | Math |
在這個表中,StudentID 可以作為主碼,因為每個學生的 StudentID 都是唯一的且不為空。
關鍵點:
唯一性:確保主碼的每個值在整個表中都是唯一的。
非空性:主碼值不能為 NULL,因為每一行記錄都需要能夠被唯一標識。
其他相關概念:
候選鍵:候選鍵是一個表中可以作為主碼的候選屬性或屬性組合,通常有多個候選鍵。最終選擇一個作為主碼,其余的候選鍵可能成為唯一鍵(Unique Key)。
外鍵(Foreign Key):外鍵是一個表中的列,指向另一個表的主碼或唯一鍵,用于在兩個表之間建立聯系。
5.連接運算
在關系數據庫中,連接運算(Join)是一種用于將兩個或多個表中的數據根據某些條件組合成一個新表的操作。連接運算是關系數據庫中非常常用的操作,它使得可以在不同表之間建立關系,并且在查詢中獲取跨表的數據。
常見的連接類型:
6.內連接(Inner Join):
內連接是最常見的連接類型,它返回兩個表中符合連接條件的所有記錄。
如果某一行在兩個表中都找不到匹配項,則該行不會出現在結果中。
SELECT *
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
示例: 假設有兩個表:
Students:學生信息表
Enrollments:學生選課信息表
SELECT Students.StudentID, Students.Name, Enrollments.CourseID
FROM Students
INNER JOIN Enrollments
ON Students.StudentID = Enrollments.StudentID;
這個查詢會返回所有選了課程的學生的學號、姓名和課程ID。
7. 左連接(Left Join 或 Left Outer Join)
左連接返回左表中的所有記錄和右表中符合條件的記錄。如果右表沒有匹配項,則返回 NULL。
它確保左表中的每一行都出現在結果中,即使右表中沒有匹配的記錄。
SELECT *
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
示例:
SELECT Students.StudentID, Students.Name, Enrollments.CourseID
FROM Students
LEFT JOIN Enrollments
ON Students.StudentID = Enrollments.StudentID;
這個查詢會返回所有學生的信息,包括那些沒有選課的學生(對于沒有選課的學生,課程ID為NULL)。
8.右連接(Right Join 或 Right Outer Join):
右連接與左連接相反,返回右表中的所有記錄和左表中符合條件的記錄。如果左表沒有匹配項,則返回 NULL。
SELECT *
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
示例:
SELECT Students.StudentID, Students.Name, Enrollments.CourseID
FROM Students
RIGHT JOIN Enrollments
ON Students.StudentID = Enrollments.StudentID;
這個查詢會返回所有選課的記錄,包括那些沒有學生信息的記錄(例如,某些課程沒有學生報名時)。
9.全連接(Full Join 或 Full Outer Join)
全連接返回兩個表中的所有記錄。如果某一行在某個表中找不到匹配項,則返回 NULL。換句話說,左表和右表的所有記錄都會出現在結果中。
語法:
SELECT *
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
示例:
SELECT Students.StudentID, Students.Name, Enrollments.CourseID
FROM Students
FULL JOIN Enrollments
ON Students.StudentID = Enrollments.StudentID;
這個查詢會返回所有學生和所有選課記錄,包括那些沒有選課的學生和那些沒有學生選課的課程。
10.交叉連接(Cross Join)
交叉連接返回兩個表的笛卡爾積,即每一行左表的記錄都會與右表的每一行記錄進行組合,結果的行數是左表行數乘以右表行數。
語法:
SELECT *
FROM table1
CROSS JOIN table2;
示例: 假設有兩個表:
Products:產品信息
Shops:商店信息
SELECT Products.ProductName, Shops.ShopName
FROM Products
CROSS JOIN Shops;
這個查詢會返回每個產品和每個商店的組合,生成笛卡爾積。
11.連接運算的基本規則:
連接條件通常使用 ON 關鍵字來指定,用來定義兩個表之間的關聯列。
連接操作不僅限于單表之間的連接,還可以通過多表連接來查詢更復雜的數據。
連接運算可以通過多個條件進行組合,例如使用 AND 或 OR 來連接多個列。
12.連接運算的應用場景:
多表查詢:通過連接多個表,能夠從多個數據源中檢索和組合信息。
關聯數據:例如在學生與課程、訂單與客戶、商品與銷售記錄之間建立關系。
數據整合:連接運算能夠將拆分在多個表中的信息整合到一起,從而方便進行分析和處理。
13.笛卡爾運算(Cross Join)
參考交叉連接
示例
假設有兩個表:
Products
+----------+----------+
| ProductID| Name |
+----------+----------+
| 101 | 手機 |
| 102 | 電腦 |
+----------+----------+Shops
+----------+----------+
| ShopID | Location |
+----------+----------+
| 1 | 北京 |
| 2 | 上海 |
+----------+----------+
執行:
SELECT *
FROM Products
CROSS JOIN Shops;
+----------+----------+----------+----------+
| ProductID| Name | ShopID | Location |
+----------+----------+----------+----------+
| 101 | 手機 | 1 | 北京 |
| 101 | 手機 | 2 | 上海 |
| 102 | 電腦 | 1 | 北京 |
| 102 | 電腦 | 2 | 上海 |
+----------+----------+----------+----------+
說明:
由于 Products 表有 2 行,Shops 表有 2 行,所以最終生成了 2 × 2 = 4 行的結果。
每個產品都會和每個商店匹配,這就是笛卡爾積的作用。
14.自然連接 (Natural Join)
自然連接是一種特殊的等值連接(Equi Join),它自動匹配兩個表中具有相同名稱的列,并根據這些列的值進行連接。
特點
自動匹配:自然連接會查找兩個表中列名相同且類型相同的列,并使用這些列作為連接條件。
去除冗余列:如果兩個表中有相同的列,自然連接不會在結果集中重復出現該列(只保留一列)。
等值匹配:只返回那些在匹配列上具有相同值的行。
SQL 語法
SELECT *
FROM table1
NATURAL JOIN table2;
示例
假設有兩個表:
Students
StudentID | Name | Age |
---|---|---|
1 | 張三 | 20 |
2 | 李四 | 21 |
3 | 王五 | 21 |
Enrollments
StudentID | CourseID |
---|---|
1 | CS101 |
2 | MA102 |
4 | PH103 |
SELECT *
FROM Students
NATURAL JOIN Enrollments;
結果
StudentID | Name | Age | CourseID |
---|---|---|---|
1 | 張三 | 20 | CS101 |
2 | 李四 | 21 | MA102 |
注意:
StudentID 作為公共列,只顯示一次。
王五 沒有選課,StudentID=3 被過濾掉。
StudentID=4 的選課記錄 PH103 也被過濾掉,因為該學生不在 Students 表中。
第一章習題
這一章講述了數據庫系統的幾個主要的優點。它有哪兩個不足之處?
數據庫系統的優點與不足
優點:
數據獨立性:數據庫系統提供了物理數據和邏輯數據的獨立性,使得用戶和應用程序不需要關心數據的物理存儲方式。
數據一致性與完整性:通過約束和事務管理,數據庫系統確保了數據的一致性、完整性和正確性。
不足:
性能開銷:數據庫系統需要執行許多復雜的操作(如索引管理、查詢優化、事務管理等),這可能導致性能開銷較大。
成本:開發和維護數據庫系統通常需要高昂的硬件、軟件和人力成本,特別是對于大型企業級數據庫系統。
列出 Java 或 C++之類的語言中的類型說明系統與數據庫系統中使用的數據定義語言的 5 個不同之處。
列出為一個企業建立數據庫的六個主要步驟。
需求分析:與企業各個部門和用戶溝通,明確系統需要存儲和處理的數據類型、使用場景和功能需求。
概念設計:設計一個抽象的數據模型,通常采用實體-關系模型(ER圖)來描述系統的數據需求。
邏輯設計:將概念模型轉化為數據庫結構,例如表格、字段和關系等。
物理設計:根據具體的數據庫管理系統(DBMS)要求,將邏輯設計轉換為實際的存儲方案,定義索引、分區等物理存儲細節。
實施:在DBMS中實現數據庫設計,創建表、約束、存儲過程等,并導入數據。
維護與優化:對數據庫進行定期的維護,進行性能優化、數據備份、安全管理等工作。
除1. 6. 2 節中已經列出的之外,請列出大學要維護的至少 3 種不同類型的信息
學生信息:包括學號、姓名、性別、出生日期、專業、年級等。
課程信息:包括課程編號、課程名稱、授課教師、學分、學時等。
教職工信息:包括工號、姓名、職位、部門、工資等。
假設你想要建立一個類似于 YouTube 的視頻節點。考慮 1. 2 節中列出的將數據保存在文件系統中的各個缺點,討論每一個缺點與存儲實際的視頻數據和關于視頻的元數據(諸如標題、上傳它的用戶、標簽、觀看它的用戶) 的關聯
文件系統缺點與存儲視頻數據的關聯:
缺少結構化:文件系統通常不提供數據表的結構,視頻文件存儲僅是單純的文件管理,沒有內建的查詢和檢索功能,這導致無法高效管理和查詢視頻的元數據(如標題、標簽、觀看次數等)。
不易擴展:當視頻數量和數據量增大時,文件系統會面臨擴展問題,尤其在視頻文件不斷增加的情況下,管理和備份視頻數據變得更加困難。
數據一致性差:文件系統沒有內建的事務管理機制,如果多個用戶同時對視頻進行上傳或修改,容易造成數據一致性問題。相比之下,數據庫系統能夠保證多個操作的原子性和一致性。
文件系統缺點與存儲元數據的關聯:
查詢困難:文件系統中的元數據(如視頻的標題、上傳者、觀看用戶等)通常是存儲在文件名或附加文件中的,查詢這些信息通常需要手動處理文件,而不能像數據庫那樣通過結構化查詢進行高效檢索。
安全性問題:文件系統沒有內建的權限管理和訪問控制機制,可能導致視頻數據的未經授權訪問或泄露,而數據庫系統則能更好地控制訪問權限。
在 Web 查找中使用的關鍵字查詢與數據庫查詢很不一樣。請列出這兩者之間在查詢表達方式和查詢結果是什么方面的主要差異
列出四個你使用過的很可能使用了數據庫來存儲持久數據的應用
社交媒體應用(如 Facebook, Instagram):
這些平臺需要存儲大量的用戶數據、帖子、評論、點贊、好友關系等。它們通常使用關系型數據庫(如 MySQL)或非關系型數據庫(如 Cassandra)來處理這些數據。
電子商務平臺(如 Amazon, 淘寶):
電子商務平臺需要存儲用戶信息、訂單數據、商品庫存、支付記錄等信息,這些數據需要持久化存儲并且能夠高效查詢。
在線銀行系統:
用于管理客戶賬戶信息、交易記錄、余額等數據。這些數據需要保持一致性和安全性,因此一般使用關系型數據庫(如 Oracle, SQL Server)。
視頻流媒體平臺(如 YouTube):
視頻平臺需要存儲視頻內容、視頻元數據(標題、標簽、上傳者等)、觀看記錄和用戶交互等信息。數據庫在這種情況下主要用于管理視頻的元數據和用戶的交互信息。
列出文件處理系統和 DBMS 的四個主要區別
解釋物理數據獨立性的概念,以及它在數據庫系統中的重要性
物理數據獨立性是指應用程序與物理數據存儲結構之間的獨立性。它意味著用戶不需要知道或關注數據的物理存儲細節(如存儲位置、索引結構等),而可以專注于如何查詢和操作數據。數據庫系統通過提供這種獨立性,使得當物理存儲方式發生變化時(如硬件升級或索引重構),應用程序不必修改,減少了維護的復雜性。
重要性:
簡化數據管理:管理員可以根據需要優化物理存儲方式而不影響應用層和用戶。
減少開發成本:程序員無需關心數據如何存儲,只關心邏輯數據模型,從而提高開發效率。
提高系統靈活性:物理數據存儲可以隨時根據需求進行調整和優化,而不會影響到用戶查詢的功能。
列出數據庫管理系統的五個職責。對每個職責,說明當它不能被履行時會產生什么樣的問題。
數據存儲管理:
職責:管理數據的存儲、讀取、更新等操作,確保數據存儲的高效性。
問題:如果不能正確履行這一職責,可能導致數據存儲效率低下、數據損壞或訪問速度慢。
數據查詢管理:
職責:解析和執行用戶查詢,優化查詢過程,返回正確的結果。
問題:查詢可能變得非常慢,用戶獲取數據的效率低,且可能返回錯誤結果。
數據安全管理:
職責:確保數據的安全性,包括訪問控制、加密、權限管理等。
問題:如果沒有適當的安全管理,可能會導致敏感數據泄露,未授權的用戶訪問數據。
并發控制:
職責:處理多個用戶同時訪問數據庫時的事務,并確保事務之間的數據一致性。
問題:如果沒有并發控制,可能會導致數據的競爭條件和不一致性,例如兩人同時修改同一條數據時出錯。
數據備份與恢復:
職責:定期備份數據庫,并在數據丟失或損壞時恢復數據。
問題:如果沒有有效的備份和恢復機制,可能會導致數據丟失或災難恢復困難。
請給出至少兩種理由說明為什么數據庫系統使用聲明性查詢語言,如 SQL,而不是只提供 C 或者 C ++的函數庫來執行數據操作。
簡化查詢表達:
SQL 是聲明性語言,用戶只需描述“做什么”(例如“選擇哪些數據”),而不需要指定“如何做”(如循環、數據結構等)。這比在 C 或 C++ 中用函數庫進行復雜的數據操作要簡潔得多。
優化查詢:
SQL 查詢語言具有內建的查詢優化功能,數據庫管理系統可以自動選擇最佳的查詢執行計劃。而在 C 或 C++ 中,開發者需要手動優化代碼,增加了復雜度和出錯的可能性
解釋用圖 1-4 中的表來設計會導致哪些問題。
數據冗余:如果表設計不規范,可能會導致數據的重復存儲,增加存儲空間和維護成本。
更新異常:例如在一個表中存儲了多次相同的客戶信息,當客戶數據變化時,必須在多個位置進行更新,否則會導致數據不一致。
查詢效率低:缺乏索引優化的表在查詢時可能會非常慢,尤其在大數據量情況下。
數據庫管理員的五種主要作用是什么?
數據庫設計與架構:
負責數據庫的總體設計,包括選擇合適的數據庫架構、數據模型以及表的設計。
性能優化:
負責數據庫的性能優化,優化查詢、索引、緩存等,確保數據庫的高效運行。
數據安全:
負責確保數據庫的安全性,設置訪問權限、用戶角色、加密機制等。
備份與恢復:
負責定期備份數據庫,并制定有效的災難恢復計劃,確保數據不會丟失。
故障排除與維護:
負責數據庫的監控與維護,確保數據庫系統的正常運行,并處理數據庫出現的問題(如鎖、死鎖、性能瓶頸等)
解釋兩層和三層體系結構之間的區別。對 Web 應用來說哪一種更合適? 為什么?
兩層體系結構:
由 客戶端 和 數據庫服務器 組成。客戶端直接與數據庫進行通信,執行查詢和數據操作。
優點:簡單,部署方便。
缺點:客戶端與數據庫直接交互,容易導致性能瓶頸和安全問題,無法有效分離應用邏輯。
三層體系結構:
由 客戶端、應用服務器 和 數據庫服務器 組成。客戶端與應用服務器交互,應用服務器與數據庫進行通信。應用服務器通常處理業務邏輯。
優點:實現了應用邏輯和數據庫的分離,提升了安全性和擴展性。
缺點:架構復雜,部署和維護成本較高。
對于 Web 應用來說,三層體系結構更合適。原因是:
三層架構可以更好地分離關注點,將業務邏輯和數據庫操作分開,增強安全性和可維護性。
它支持更高的可擴展性,能夠處理更多的并發請求。
描述可能被用于存儲一個社會網絡系統如 Facebook 中的信息的至少 3 個表
用戶表:
存儲用戶信息,如用戶ID、用戶名、郵箱、密碼、個人資料等。
CREATE TABLE Users (user_id INT PRIMARY KEY,username VARCHAR(100),email VARCHAR(100),password VARCHAR(100),profile_picture VARCHAR(255),date_of_birth DATE
);
朋友關系表:
存儲用戶之間的朋友關系,包括用戶ID和好友的ID。
CREATE TABLE Friendships (user_id INT,friend_id INT,status VARCHAR(20),PRIMARY KEY (user_id, friend_id),FOREIGN KEY (user_id) REFERENCES Users(user_id),FOREIGN KEY (friend_id) REFERENCES Users(user_id)
);
帖子表:
存儲用戶發布的帖子信息,如帖子ID、內容、發布者ID、發布時間等。
CREATE TABLE Posts (post_id INT PRIMARY KEY,user_id INT,content TEXT,post_time TIMESTAMP,FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
這些表設計可以用于存儲用戶數據、朋友關系以及用戶的社交互動信息,為社交網絡系統提供支持。