資料庫:一對一,一對多,多對多
一對一:就是說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作為主鍵。
比如
-
create table test
-
(
-
name varchar(19),
-
id number,
-
value varchar(10),
-
primary key (name,id)
-
)
上面的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這個唯一值。(這就是多對多關係)
複合主鍵是一個表中 用兩個欄位來確定資料唯一性
(這個是表中任意欄位)
聯合主鍵則是用兩個或多個表中的主鍵組合起來確定資料唯一性
(這個是兩個表的主鍵)
多對多中就是可以用聯合主鍵。(因為兩個鍵可以保證不重複)