資料庫三大範式
第一範式(1NF):
是指資料庫表的每一列都是不可分割的基本資料項目,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。個人總結:不能有表中表。
如資料表不能這樣設計,因為資料表的一個二維表:
| 姓名 |
思想道德素質測評(20%) |
專業素質測評(60%) |
| 基礎分 |
獎勵分 |
懲罰分 |
最後得分 |
排名 |
必修課成績 |
獎勵分 |
懲罰分 |
最後得分 |
排名 |
| 得分 |
排名 |
| 張三 |
78 |
0 |
0 |
78 |
2 |
71.7 |
1 |
0 |
0.0 |
71.7 |
1 |
| 王五 |
78 |
0 |
0 |
78 |
2 |
71.3 |
24 |
0.0 |
0.0 |
71.3 |
2 |
| 李四 |
78 |
0 |
0 |
78 |
2 |
70.8 |
25 |
0.0 |
2.0 |
68.8 |
3 |
而這樣設計是可以的:
| 姓名 |
C語言 |
java |
MySQL |
Oracle |
| 張三 |
78 |
88 |
68 |
78 |
| 王五 |
78 |
55 |
87 |
78 |
| 李四 |
78 |
86 |
91 |
56 |
第二範式(2NF):
要求資料庫表中的每個執行個體或行必須可以被惟一地區分,資料庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴(部分函數依賴指的是存在組合關鍵字中的某些欄位決定非關鍵字段的情況),也即所有非關鍵字段都完全依賴於任意一組候選關鍵字。個人總結:非主屬性依賴於主屬性
如以下成績表
| student_id |
course_id |
grade |
birthday |
| 20101661 |
1 |
56 |
1991,07,14 |
| 20101662 |
3 |
58 |
1993,7,25 |
這樣設計不行,因為grade完全依賴於主碼student_id、course_id,而birthday只依賴於部分主碼student_id。所以要將其拆分成兩個表
student(student_id, birdthday);
grade(student_id, course_id, birthday);
course_id為聯絡student表的外鍵
第三範式(3NF):
要求一個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊,在第二範式的基礎上,資料表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三範式。個人總結:不能有傳遞性
如以下表
| student_id |
course_id |
birthday |
SD(所在系的名稱) |
SL(所在宿舍樓) |
| 20101661 |
1 |
1991,07,14 |
軟體學院 |
1棟 |
| 20101662 |
3 |
1993,7,25 |
經管學院 |
2棟 |
student_id為主碼,SL依賴於student_id,但可以從非主碼屬性SD匯出,即知道了SD,也就知道了SL。可以獎這個表拆分成兩個表,如下:
grade(student_id, course_id,SD);
department(SD, SL);
SD為聯絡grade表的主鍵
資料庫的儲存方式
順序存放,平均查詢次數為關係的記錄個數的1/2;
雜湊存入,平均查詢次數由雜湊演算法決定;
索引存放,要確定建立何種索引,及建立索引的表和屬性;
聚簇存放,記錄聚簇是指將不同類型的記錄分配到相同的物理地區中,以充分利用順序性的優點,提高訪問速度。