l 數據庫的主鍵、外鍵
關係型數據庫中的一條記錄中有若干個屬性,若其中某一個屬性組能唯一標識一條記錄,該屬性組就可以成爲一個主鍵。
比如:
Student(stuID,name, sex,class)
每個學生的學號(stuID)是唯一的,作爲表的主鍵
課程表(課程號,課程名,學分)
課程號是唯一的,課程號就是一個主鍵
成績表(學號,課程號,課程名,成績)
成績表中單一一個屬性無法唯一標識一條記錄,學號和課程號組合才能唯一標識一條記錄,屬性組學號+課程號作爲一個主鍵。
成績表中學號不是成績表的主鍵,但與學生表中學號相對應,在學生表中學號是主鍵,則稱成績表中的學號是學生表的外鍵。
定義主鍵和外鍵能確定一條記錄的唯一標識;
外鍵用於與另一張表關聯,是能確定另一張表記錄的字段,爲了保持數據的一致性。
l 設計規則
主鍵用途:一行的唯一標識、作爲一個可以被外鍵有效引用的對象
主鍵設計原則:
1、 應當對於用戶沒有意義
2、 應該是單列的,以便提高連接和篩選操作的效率
l 數據庫設計三大範式
範式是關係型數據庫中符合某一種設計要求的總結。
1、第一範式
要求數據庫表中所有字段值都是不可再分(根據設計系統的實際需求)的原子值。
2、第二範式
在第一範式的基礎上,要求數據表裏的所有數據都要和該數據表的主鍵有完全依賴關係。每個非鍵屬性完全依賴於主鍵。
減少冗餘將不同類別分開,例如商品信息和訂單信息。
3、第三範式(3NF)
確保每列都和主鍵列直接相關,而不是間接相關
l Null與空
區分:
1、 NULL表示未知,佔用空間,不走索引,DBA建議最好設置字段NOT NULL避免低效率的事情發生。
2、 空(’’)是不佔用空間的
官方對於null的解釋:
“NULL columns require additional space in therow to record whether their values are NULL. For MyISAM tables, each NULLcolumn takes one bit extra, rounded up to the nearest byte.”
“空列需要額外的空間記錄該行其值是否爲NULL。對於MyISAM表,每個NULL列需要一個額外的位,四捨五入到最接近的字節。
在使用上的注意事項:
1:在進行count()統計某列的記錄數的時候,如果採用的NULL值,會別系統自動忽略掉,但是空值是會進行統計到其中的。
2: 判斷NULL 用IS NULL 或者 is not null,SQL 語句函數中可以使用ifnull()函數來進行處理,判斷空字符用=''或者 <>''來進行處理
3: 對於MySQL特殊的注意事項,對於timestamp數據類型,如果往這個數據類型插入的列插入NULL值,則出現的值是當前系統時間。插入空值,則會出現 '0000-00-00 00:00:00'
4:對於空值的判斷到底是使用is null 還是 =''要根據實際業務來進行區分。
l 主鍵與索引
主鍵:惟一地標識一行;作爲一個可以被外鍵有效引用的對象。常常與外鍵構成參照完整性約束,防止出現數據不一致。
索引:一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。
1. 主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。
所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。因爲主鍵可以唯一標識某一行記錄,所以可以確保執行數據更新、刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外鍵構成參照完整性約束,防止出現數據不一致。數據庫在設計時,主鍵起到了很重要的作用。
主鍵可以保證記錄的唯一和主鍵域非空,數據庫管理系統對於主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。
2. 一個表中可以有多個唯一性索引,但只能有一個主鍵。
3. 主鍵列不允許空值,而唯一性索引列允許空值。
4. 索引可以提高查詢的速度。
其實主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵,意思就是主鍵不實際存在,而索引實際存在在數據庫中,主鍵一般都要建,主要是用來避免一張表中有相同的記錄,索引一般可以不建,但如果需要對該表進行查詢操作,則最好建,這樣可以加快檢索的速度。