數據庫設計多對多關系的幾種形態
前言:多對多關系至少需要3個表,我們把壹個表叫做主表,壹個叫做關系表,另外壹個叫做字典表或者副表(字典表是紀錄比較少,而且基本穩定的,例如:版塊名稱;副表是內容比較多,內容變化的,例如)。 www.2cto.com
按照數據庫的增刪查改操作,多對多關系的查找都可以用inner join或者select * from 主表 where id in (select 主表id from 關系表)
1,角色任命型
特點:關系表兩外鍵組合無重復紀錄,關系表壹般不需要時間字段和主鍵,有壹個表是字典類型的表。
界面特點:顯示主表,用checkbox或多選select設置多選關系。
例如:任命版主(用戶表-關系表-版塊名稱表),角色權限控制等,用戶是5個版塊版主,只要關系表5行紀錄就可以確立,關系表的兩個外鍵具有聯合主鍵性質。
增加關系:如果沒有組合紀錄,insert之。
刪除關系:如果有組合紀錄,刪除之。
2,集合分組型
特點:同角色任命型類似,關系表兩外鍵組合無重復紀錄,關系表壹般不需要時間字段和主鍵。區別是主副表都不是字典表,可能都很大不固定。
界面特點:顯示主表,用搜索代替簡單的checkbox或多選select,或者壹條壹條的添加。
例如:歌曲專集(專集表-關系表-歌曲表)。手機分組(分組表-關系表-手機表)。用戶圈子(圈子表-關系表-用戶表)。文章標簽(文章表-關系表-標簽表)
增加關系:同版主任命型。
刪除關系:同版主任命型。
3,明細帳型
特點:關系表可以有重復紀錄,關系表壹般有時間字段,有主鍵,可能還有文字型的字段用來說明每次發生關系的原因(消費)。
界面特點:顯示關系表,用radio或下拉設置單選關系。
例如:現金消費明細帳或訂單(用戶表-訂單表-消費原因表),用戶可能多次在同壹事情上重復消費。積分變化紀錄也屬於這類。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間。
刪除關系:根據關系表PK刪除。
4,評論回復型
特點:同明細帳型關系表壹般有時間字段,有主鍵,區別是重點在文字型的字段用來說明每次發生關系的內容(評論回復)。
界面特點:回復文本框。
例如:論壇回復(用戶表-回復表-帖子表),用戶可能多次在不同帖子上評論回復費。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間和文字。
刪除關系:根據關系表(回復表)PK刪除。
5,站內短信型
特點:主副表是同壹個,關系表壹般有時間字段,有主鍵,重點在關系表文字型的字段用來說明每次發生關系的內容(消息)或者其他標記位來表示文字已讀狀態時間等。
界面特點:回復文本框。
例如:站內短信(用戶表-短信表-用戶表),用戶可能給用戶群發或者單發,有標記位來表示文字已讀狀態時間等。
增加關系:不管有沒有組合紀錄,insert之,紀錄時間和文字。
刪除關系:根據關系表(回復表)PK刪除。
6,用戶好友型
特點:主副表是同壹個,同集合分組型,關系表兩外鍵組合無重復紀錄,關系表壹般不需要時間字段和主鍵。
界面特點:同集合分組型,顯示主表,用搜索代替簡單的checkbox或多選select,或者壹條壹條的添加。
例如:下載站點的文件,(文件表-關系表-文件表)可以被軟件工具打開,軟件工具本身也是壹種文件,可以被下載。用戶的好友,也是用戶(用戶表-好友關系表-用戶表)
增加關系:同版主任命型。
刪除關系:同版主任命型。
7,未知屬性型
特點:在設計初期,主表的某些字段類型和名稱是不確定的時候,關系表實際上是主表的可擴展字段,
壹個[主表](ID),
壹個[屬性名稱表](屬性ID.屬性名稱),
壹個[屬性值表],包括3個字段:
屬性值(屬性Value varchar(500))
主表ID
屬性ID
這樣可以作到最小冗余度。
(和常見的多對多關系不同的是:值統壹用varchar來存儲,因為這類型的值壹般不會用來計算)。
比如:
軍隊的數據庫設計中有種物資叫做?戰繳物資?,就是打仗的時候繳獲的,軍隊自己都不知道這些物資有什麽屬性。
比如繳獲的化學品有化學名,通用名,是否有輻射,計量單位,包裝規格,數量等等,或者不是化學品是其他任何未知的東西。
這樣東西就可以
某奇怪東西.屬性集合["某某奇怪屬性名"]="某某奇怪值";
某變態東西.屬性集合["某某變態屬性名"]="某某變態值";
這樣存儲。
再比如:
手機型號有幾千種,除了***同屬性外還有不同屬性有幾百個,屬性名和值類型都不壹樣,有的手機有這屬性,有的沒有。
對於這樣的?多態?,我們就采用上面的設計結構。
其效果相當於:
某奇怪手機.屬性集合["某某奇怪屬性名"]="某某奇怪值";
某變態手機.屬性集合["某某變態屬性名"]="某某變態值";
界面特點:設置主表壹行紀錄的屬性時候,要列出所有可能的屬性名稱,每個對應壹個文本框。
總結這個的目的是做通用的後臺。
只要有:
1,通用的單個表維護(1-2種)。
2,通用的壹對多關系維護(1-2種)。
3,通用的多對多關系維護(7-10種)。
4,通用的樹型關系維護(2-3種)。
就大體完成了後臺的80%工作。
而且,所有項目通用,如果壹個團隊同時有多個項目,可以節省大量勞動時間。