1. 程式人生 > >資料庫:一對一,一對多,多對多

資料庫:一對一,一對多,多對多

一對一:就是說A表中的一條記錄對應著B表的一條記錄。大家可能會覺得這不是變得複雜了嗎?其實不然,如果,當一張表的欄位過於太多,而很多欄位可能只有在某些情況下,才會使用到,這時也可以考慮使用一對一設計。

條件:建立單獨的表就行了,

優點

1.   便於管理、可提高一定的查詢速度

2.   減輕 CPU 的 IO 讀寫,提高存取效率。

3.   符合資料庫設計的三大正規化。

4.   符合關係性資料庫的特性。

  缺點

1.   增加一定的複雜程度,程式中的讀寫難度加大

 一對多:顧名思義,A表一條資料對應B表多條資料。需要將A表主鍵作為B表的外來鍵。

sql語句 :A :primary key (‘id’);(指定主鍵)

                B:FOREIGN KEY('B-id') REFERENCES  'A' ('id'); (將外來鍵B-id和主鍵id關聯)

多對多: 需要一張中間表來對應他們的關係。那麼此時,A,B表並不需要其他的外來鍵。只需各有自己的主鍵就行,就像一張單獨的表一樣。

因為需要一張單獨的關係表來對映他們的關係。 

就比如這個:將orderid和productid作為聯合主鍵。然後相互對應各自的外來鍵。

有人可能就疑惑了,怎麼這裡設定了兩個主鍵?

有必要講下聯合主鍵和複合主鍵了。

一、複合主鍵

  所謂的複合主鍵 就是指你表的主鍵含有一個以上的欄位組成,不使用無業務含義的自增id作為主鍵。

比如 

  1. create table test

  2. (

  3. name varchar(19),

  4. id number,

  5. value varchar(10),

  6. primary key (name,id)

  7. )


上面的name和id欄位組合起來就是你test表的複合主鍵 ,它的出現是因為你的name欄位可能會出現重名,所以要加上ID欄位這樣就可以保證你記錄的唯一性 ,一般情況下,主鍵的欄位長度和欄位數目要越少越好 。

這裡就會有一個疑惑?  主鍵是唯一的索引,那麼為何一個表可以建立多個主鍵呢?

其實“主鍵是唯一的索引”這話有點歧義的。舉個例子,我們在表中建立了一個ID欄位,自動增長,並設為主鍵,這個是沒有問題的,因為“主鍵是唯一的索引”,ID自動增長保證了唯一性,所以可以。


此時,我們再建立一個欄位name,型別為varchar,也設定為主鍵,你會發現,在表的多行中你是可以填寫相同的name值的,這豈不是有違“主鍵是唯一的索引”這句話麼?


所以我才說“主鍵是唯一的索引”是有歧義的。應該是“當表中只有一個主鍵時,它是唯一的索引;當表中有多個主鍵時,稱為複合主鍵,複合主鍵聯合保證唯一索引”。


為什麼自增長ID已經可以作為唯一標識的主鍵,為啥還需要複合主鍵呢。因為,並不是所有的表都要有ID這個欄位,比如,我們建一個學生表,沒有唯一能標識學生的ID,怎麼辦呢,學生的名字、年齡、班級都可能重複,無法使用單個欄位來唯一標識,這時,我們可以將多個欄位設定為主鍵,形成複合主鍵,這多個欄位聯合標識唯一性,其中,某幾個主鍵欄位值出現重複是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重複。

二、聯合主鍵

           聯合主鍵顧名思義就是多個主鍵聯合形成一個主鍵組合(主鍵原則上是唯一的,別被唯一值所困擾。)  

           聯合主鍵的意義:用2個欄位(或者多個欄位,後面具體都是用2個欄位組合)來確定一條記錄,說明,這2個欄位都不是唯一的,2個欄位可以分別重複,這麼設定的好處,可以很直觀的看到某個重複欄位的記錄條數。

一個簡單的例子 


主鍵A跟主鍵B組成聯合主鍵 


主鍵A跟主鍵B的資料可以完全相同,聯合就在於主鍵A跟主鍵B形成的聯合主鍵是唯一的。 
下例主鍵A資料是1,主鍵B資料也是1,聯合主鍵其實是11,這個11是唯一值,絕對不充許再出現11這個唯一值。(這就是多對多關係) 

複合主鍵是一個表中 用兩個欄位來確定資料唯一性

(這個是表中任意欄位)

聯合主鍵則是用兩個或多個表中的主鍵組合起來確定資料唯一性

(這個是兩個表的主鍵)

多對多中就是可以用聯合主鍵。(因為兩個鍵可以保證不重複)