表的結構
列:由多個字段構成,每個字段存儲單一數據項,列的先后順序對表沒有影響
行:記錄,一個表中不能存在完全相同的兩行,行的順序對表沒有影響
主鍵:primary key 表中的一列或多列組合起來唯一的標識表中的一條記錄
主鍵的選取:
- 業務(邏輯)主鍵:選擇使用業務中有實際意義的一個字段做主鍵,比如身份證號碼,手機號...
- 代理主鍵:使用一個無意義的數值: 自增長的數值, UUID(通用唯一識別碼)
外鍵:foreign key 用于連接另外一張表,(通常)是連接表中的主鍵或唯一鍵
外鍵約束:數據的一致性
?關系范式:一套約束、確保多個表結構的設計符合關系模型
- 1NF:每一列都是不可再分的原子數據項,即表中的每個字段都是不可分割的基本數據項,不能包含多個值。
當數據為1對多時,可以提取為另外一個表,嵌入原表中
不符合1NF:
用戶表
user_id | user_name | phone_numbers
1 | Alice | 1234567890, 0987654321
符合1NF:
用戶表
user_id | user_name
1 | Alice用戶電話表
user_id | phone_number
1 | 1234567890
1 | 0987654321
- 2NF:主鍵依賴,非主鍵字段必須完全依賴于主鍵字段,不能部分依賴于主鍵。否則要提取出另外的表
不符合2NF:
訂單表
order_id | product_id | product_name | quantity
1 | 101 | Product A | 2
1 | 102 | Product B | 3在這個表中,product_name 只依賴于 product_id,而不是整個主鍵 (order_id, product_id)
符合2NF:
訂單表
order_id | product_id | quantity
1 | 101 | 2
1 | 102 | 3產品表
product_id | product_name
101 | Product A
102 | Product B
- 3NF:表中的非主鍵字段不能存在傳遞依賴關系,即非主鍵字段之間不能存在依賴關系。當非鍵之間有依賴時,可以提取為另外的表
不符合3NF:
學生表
student_id | student_name | department_name | department_head
1 | Alice | Computer Sci | Dr. Smith
符合3NF:
學生表
student_id | student_name | department_id
1 | Alice | 1部門表
department_id | department_name | department_head
1 | Computer Sci | Dr. Smith
意義
- 減少冗余(一些數據只存一次,而非存儲多次)
- 保證數據完整性、一致性
- 簡化數據維護
- 提高查詢效率(當不符合范式時效率更高,則會由反范式的操作)