數據庫設計問題整理

l  數據庫的主鍵、外鍵

關係型數據庫中的一條記錄中有若干個屬性,若其中某一個屬性組能唯一標識一條記錄,該屬性組就可以成爲一個主鍵。

比如:

         Student(stuID,name, sex,class)

         每個學生的學號(stuID)是唯一的,作爲表的主鍵

         課程表(課程號,課程名,學分)

         課程號是唯一的,課程號就是一個主鍵

         成績表(學號,課程號,課程名,成績)

         成績表中單一一個屬性無法唯一標識一條記錄,學號和課程號組合才能唯一標識一條記錄,屬性組學號+課程號作爲一個主鍵。

 

成績表中學號不是成績表的主鍵,但與學生表中學號相對應,在學生表中學號是主鍵,則稱成績表中的學號是學生表的外鍵。

 

定義主鍵和外鍵能確定一條記錄的唯一標識;

外鍵用於與另一張表關聯,是能確定另一張表記錄的字段,爲了保持數據的一致性。

 

l  設計規則

主鍵用途:一行的唯一標識、作爲一個可以被外鍵有效引用的對象

主鍵設計原則:

1、  應當對於用戶沒有意義

2、  應該是單列的,以便提高連接和篩選操作的效率

 

l  數據庫設計三大範式

範式是關係型數據庫中符合某一種設計要求的總結。

1、第一範式

要求數據庫表中所有字段值都是不可再分(根據設計系統的實際需求)的原子值。


2、第二範式

在第一範式的基礎上,要求數據表裏的所有數據都要和該數據表的主鍵有完全依賴關係。每個非鍵屬性完全依賴於主鍵。

減少冗餘將不同類別分開,例如商品信息和訂單信息。

3、第三範式(3NF)

確保每列都和主鍵列直接相關,而不是間接相關

 

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.      索引可以提高查詢的速度。

其實主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵,意思就是主鍵不實際存在,而索引實際存在在數據庫中,主鍵一般都要建,主要是用來避免一張表中有相同的記錄,索引一般可以不建,但如果需要對該表進行查詢操作,則最好建,這樣可以加快檢索的速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章