?
數據庫三大范式
第一范式(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;
雜湊存入,平均查詢次數由雜湊算法決定;
索引存放,要確定建立何種索引,及建立索引的表和屬性;
聚簇存放,記錄聚簇是指將不同類型的記錄分配到相同的物理區域中,以充分利用順序性的優點,提高訪問速度。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
