※ 引述《ARCHERDEVIL (開弓)》之銘言:
: AS TITLE
: 因為今天有人寄信問我說我資料庫第二題的超鍵數量怎麼回答
: 我想說我寫很多
: 乾脆複製過來這邊,拋磚引玉,說不定會有更好的發想。
: 我的寫法大致上如下
: ==========
: 題目節錄
: 表格中有關編號(欄位名稱字尾有‘_ID’)之欄位均為唯一值(unique)、單位電話(
: D_TEL)為唯一值且不能為空值(null)、聯絡電話(E_TEL)可能為空值或重覆
: 所以如果以第一個表格
: OBJECT [物資品項]
: O_ID O_NAME TYPE O_NUM
: 物資編號 物資名稱 規格 目前數量
: 以此為例
: ==========
: 只有ID是候選鍵
: 所以包含id 的所有屬性組合,都可以是超鍵
: 因此id 本身,c3取0
: id + 任一非鍵屬性 c3取1
: id + 任二非鍵屬性 c3取2
: id + 任三非鍵屬性 c3取3
: 所以是1+3+3+1=8 共八組。
這邊我沒那麼麻煩耶
因為除了ID以外都可取可不取兩種可能
而所有attribute有3個(不含ID),故總排列組合為 2^3 = 8
: ==========
: 然後寫題目太累所以我用 A B C D 舉例就好
: ==========
: 假設有A B C D 四個屬性,假設A B 分別都可以是候選鍵
: 那就會有重複問題
: 所以我會這樣寫
: 候選鍵A本身是C3取0
: A+任一屬性 C3取1
: A+任二屬性 C3取2
: A+任三屬性 C3取3
: B+任一屬性 C3取1
: B+任二屬性 C3取2
: B+任三屬性 C3取3
: 然後,因為候選鍵加上屬性的時候會產生重複
: 當候選鍵是加上任意一屬性的時候,會產生一個重複
: 候選鍵加入兩個任意屬性的時候會產生兩個重複
: 所以可以推論出,重複狀況會是非候選鍵以外的屬性產生的排列
: 當總共有四個屬性,其中兩個分別可以成為候選鍵的時候
: 非鍵值屬性有兩個
: 所以要減掉C2取0 跟C2取1 跟C2取2
: C2取0是因為
: 如果你A加上任一屬性會產生一個超鍵叫做AB
: 然後當你取B加上任一,會產生一個超鍵叫做BA
: 這時候AB兩個會產生一個重複,而這個重複沒有非鍵屬性存在
: 所以非鍵屬性有兩個,但都不取,就變成C2取0
: C2取1以此類推
: 當超鍵組合是三個屬性時不論以A為主或者以B為主
: 重複的時候一定是同時有AB存在的時候產生重複
: 此時AB佔去超鍵組合的兩個屬性空間,剩下一個是非鍵屬性
: 而總共從兩個非鍵屬性挑一個放進去 因此C2取1
: 最後,C2取2也一樣
: 當單一屬性候選鍵與其他任三屬性形成超鍵組合的時候
: 只要有AB同時存在就會產生重複
: 然後非鍵值屬性有兩個,全部都要填入,所以是C2取2
: 因此答案就會變成
: (1+3+3+1)*2-C2取0-C2取1-C2取2=16-4=12
這邊就是venn diagram的概念
把有A這個atrrtibute的集合 + 有B這個attribute的集合 - 有AB atrribute集合就好
也就是 2^3 + 2^3 - 2^2 = 8 + 8 -4 =12
不過這邊基本上都在考排列組合, 跟DB好像沒什麼關係 = =
以下恕刪 ===================