1. 程式人生 > >資料庫中父表和子表(主鍵外來鍵的理解)

資料庫中父表和子表(主鍵外來鍵的理解)

好久沒有碰資料庫分析設計了。今天突然要做一個數據庫分析,很是費解,所謂好記性不如爛筆頭,個人覺得還是要記一下的。用一個例子來說:
你想要設計的一個產品表可能是這樣的:

產品表:產品ID, 產品名稱, 產品型別

 產品ID   產品名稱        產品型別
  1        敵敵畏          農藥
  2        加多寶          飲料  
  3        可樂           飲料

那麼,接下來我們把這個產品表拆分開來(實際開發中),因為在資料庫設計中除了外來鍵以外其他欄位是不可以重複的(產生冗餘),因為不可能你一個介面就設計一張表,你需要分析這樣一對多的關係,便於管理維護:
產品表:產品ID,產品名稱,產品型別ID
產品型別表:產品型別ID,產品型別名稱

產品ID  產品名稱  產品型別ID
  1     敵敵畏     1
  2     加多寶     2
  3     可樂       2

產品型別ID   產品型別名稱
   1           農藥
   2           飲料

相信大家對於這樣的拆分是可以理解的,因為一個產品型別對應多個產品,是一對多的關係,所以我們把這個產品型別表的主鍵放到產品表中做外來鍵,形成主外來鍵的關聯,那麼產品表相當於繼承了產品型別表的東西,繼承,那麼大家可以聯想到的就是兒子繼承父親的東西,所以產品表是子表,產品型別表是父表。也有一種說法是主表和從表的說法。

還有一種比較棘手的資料庫設計模式就是多對多的關係:

學生表:學生ID,學生名稱。。。

選課表:課程ID,課程名稱。。。

學生_選課表:學生選課ID,學生ID,選課ID。。。

上面的例子中可以這麼理解,一個學生對應多個課程,而一個課程也可以對應多個課程,兩個一對多的關係,加外來鍵也是搞不定了。所以這個時候我們就可以引入一箇中間表(關係表),學生_選課表進行邏輯的處理,而且不破壞學生表和選課表的結構關係。這樣,我們如果想要查出一個學生的所有選課,或者一個選課的所有學生,就可以通過聯表查詢查出想要的結果了。奧耶

比較常用的有遞迴表:

可能你想要的是這種效果,但是對於地區名稱這個欄位中還可以細分,因為廣東屬於中國,廣州屬於廣東,存在這樣的關係。。。。

地區表:地區ID,地區名稱
         1     中國
         2     廣東
         3     廣州

我們引入一個地區ID_f就是地區ID的父親,建立遞迴關係。

地區表:地區ID,地區名稱,地區ID_f
         1     中國     0
         2     廣東     1
         3     廣州     2
         4     浙江     0

個人覺得你在資料庫表的設計上如果碰到類似這樣的表結構,我們還可以引入屬性表的概念:

顏色表:顏色ID,顏色

尺寸表:尺寸ID,尺寸

地區表:地區ID,地區名稱

等等

大家看,這些表的結構是不是相識,只有一個ID外加一個欄位。

那麼,我們可以引入屬性集合表和屬性集合明細表的概念來優化

屬性集合表:屬性集合ID,屬性集合名稱
             1        顏色
             2        尺寸
             3        地區


屬性集合明細表:屬性集合明細ID,屬性集合ID,屬性集合明細名稱
               1            1           紅色
               2            1           綠色
               3            2           大
               4            3           中國
               5            3           美國

需要注意的是,我們需要記住屬性集合的ID,這樣比較方便,我們在使用前可以對屬性集合ID進行一個判斷,如果是1,則判斷顏色。

如果大家還有比較經典的資料庫設計方法,歡迎補充