1. 程式人生 > >MySQL 表的一對一、一對多、多對多問題

MySQL 表的一對一、一對多、多對多問題

母親 其中 不用 年齡 就會 性別 應該 表的設計 nbsp

將實體與實體的關系,反應到最終數據庫表的設計上,將關系分為三種:一對一,一對多(多對一)和多對多,所有的關系都是表與表之間的關系;

一對一

一對一:一張表的一條記錄只能與另外一條記錄進行對應,反之亦然
學生表:姓名,性別,年齡,體重,身高,婚姻狀況,籍貫,家庭地址,緊急聯系人

Id(P) 姓名 性別 年齡 身高 婚姻狀況 籍貫 家庭地址 緊急聯系人 體重

表設計成以上這種形式:符合要求,其中姓名,性別,年齡,身高體重屬於常用數據,
但是婚姻籍貫住址聯系人屬於不常用的數據,如果每次查詢所有數據,不常用的數據就會影響效率,實際又不用

解決方案:將常用和不常用的信息分離存儲,分成兩張表

常用信息表:
Id(P) 姓名 性別 年齡 身高 體重
不常用信息表:
保證不常用信息與常用信息一定能夠對應上:找一個具有唯一性(確定記錄)的字段來共同連接兩張表
婚姻 籍貫 住址 聯系人 Id(p)
一個常用表中的一條記錄,永遠只能在一張不常用表匹配一條記錄,反過來一個不常用表中的一條記錄在常用表中也只能匹配一條記錄,一對一的關系。


一對多
一對多:一張表中的一條記錄可以對應另外一張表中的多條記錄,
但是返過來,另外一張表中的一條記錄只能對應第一張表的一條記錄,這種關系就是一對多或者多對一的關系
母親與孩子的關系:母親與孩子兩個實體
母親表
Id(P) 名字 年齡 性別

孩子表
Id(P) 名字 年齡 性別 媽媽Id(P)

媽媽表主鍵

以上關系,一個媽媽可以在孩子表中找到多條記錄,或者一條,但是一個孩子只能一個媽媽,是一種典型的一對多的關系
但是以上設計解決了實體設計表問題,但是沒有解決關系問題,孩子找不出媽媽,媽媽也找不到孩子。

解決方案:在某一張表中增加一個字段,能夠找到另一張表中的記錄;應該在孩子表中增加一個字段指向媽媽表;因為孩子表的記錄只能匹配到一條媽媽表的記錄


多對多
一對表中(A)的一條記錄能夠對應另外一張表(B)中的多條記錄;同時B表中的一條記錄
也能對應A表中的多條記錄

老師和學生
老師表 T_ID(P),姓名,性別
學生表 S_ID(P),姓名,性別
以上設計方案:實現了實體的設計,但是沒有維護實體的關系

一個老師教過多個學生,一個學生也被多個老師教過

解決方案:增加一張中間關系表
老師與學生的關系表:ID(P),T_ID,S_ID
老師表與中間表形成一對多的關系,而中間表是多表;維護了能夠唯一找到一表的關系;
同樣的學生表與中間表也是一個一對多的關系;
學生找老師:找出學生ID--->中間表尋找匹配記錄(多條)--->老師表匹配(一條)
老師找學生:找出老師ID--->中間表尋找匹配記錄(多條)--->學生表匹配(一條)

MySQL 表的一對一、一對多、多對多問題