表與表的關(guān)系
表與表的關(guān)系有三種:一對一翔烁,一對多(多對一)缓窜,多對多腐魂。在確定表與表的關(guān)系的時(shí)候需要確定主表和從表翩腐,依賴性更強(qiáng)的是從表,必須存在的是主表蓝谨,這樣就可以知道外鍵該設(shè)置在那個(gè)表中了灌具。
一對多:一個(gè)部門可以有多個(gè)員工,一個(gè)員工只能屬于一個(gè)部門譬巫; 一個(gè)客戶對應(yīng)多個(gè)聯(lián)系人咖楣,一個(gè)聯(lián)系人只能屬于某一個(gè)客戶。
一對多建表原則:在多的一方創(chuàng)建外鍵對應(yīng)一的一方的主鍵芦昔。
多對多:一個(gè)學(xué)生可以選擇多門課程诱贿,一門課程可以被多個(gè)學(xué)生選擇;一個(gè)訂單可以包含多個(gè)商品咕缎,一個(gè)商品可以在多個(gè)訂單中珠十;一個(gè)用戶可以選擇多個(gè)角色,一個(gè)角色可以被多個(gè)用戶選擇凭豪。
多對多建表原則:創(chuàng)建中間表焙蹭,中間表中至少有兩個(gè)字段分別作為外鍵指向多對多雙方的主鍵。(主鍵對應(yīng))
一對一:一般都建一張表墅诡。
一對一建表原則:唯一外鍵對應(yīng)/主鍵對應(yīng)壳嚎。(不常用桐智,且可合并)
一對一
?? 一對一是將數(shù)據(jù)表“垂直切分”,其實(shí)是不常見烟馅,或不常用的说庭。也就是 A 表的一條記錄對應(yīng) B 表的一條記錄,為什么要這樣的設(shè)計(jì)呢郑趁,不是增加了程度的復(fù)雜性嗎刊驴,然而并不一定,舉例說明:
1)? 一個(gè)系統(tǒng)必然有 Employee(員工表)(包含字段:EmployeeId寡润、姓名捆憎、性別、年齡梭纹、電話躲惰、地址等),每個(gè)員工都為一個(gè)用戶变抽,所以還有張 User 表(包含字段:UserId(關(guān)聯(lián) EmployeeId)础拨、用戶名、密碼绍载、角色等)诡宗,這樣你會發(fā)現(xiàn),整合為一張表是否不太妥當(dāng)击儡?因?yàn)樗郑琔ser 的記錄只會在登錄時(shí)用到,感覺有點(diǎn)違背三大范式中的“確保每列都和主鍵列直接關(guān)聯(lián)阳谍,而不是間接關(guān)聯(lián)”蛀柴。
2)? 還有種情況,這就要根據(jù)具體的業(yè)務(wù)來決定了边坤。如果名扛,當(dāng)一張表的字段過于太多谅年,而很多字段可能只有在某些情況下茧痒,才會使用到,這時(shí)也可以考慮使用一對一設(shè)計(jì)融蹂。
?? 優(yōu)點(diǎn)
1.? 便于管理旺订、可提高一定的查詢速度
2.? 減輕 CPU 的 IO 讀寫,提高存取效率超燃。
3.? 符合數(shù)據(jù)庫設(shè)計(jì)的三大范式区拳。
4.? 符合關(guān)系性數(shù)據(jù)庫的特性。
?? 缺點(diǎn)
1.? 增加一定的復(fù)雜程度意乓,程序中的讀寫難度加大樱调。