SQL Server-數據庫中多對多的關係設計

數據庫中多對多的關係設計
數據庫設計多對多關係的幾種形態 
前言:多對多關係至少需要3個表,我們把一個表叫做主表,一個叫做關係表,另外一個叫做字典表或者副表(字典表是紀錄比較少,而且基本穩定的,例如:版塊名稱;副表是內容比較多,內容變化的,例如)。 
按照數據庫的增刪查改操作,多對多關係的查找都可以用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來存儲,因爲這類型的值一般不會用來計算)。 
比如: 
軍隊的數據庫設計中有種物資叫做“戰繳物資”,就是打仗的時候繳獲的,軍隊自己都不知道這些物資有什麼屬性。 
比如繳獲的化學品有化學名,通用名,是否有輻射,計量單位,包裝規格,數量等等,或者不是化學品是其他任何未知的東西。 
這樣東西就可以 
某奇怪東西.屬性集合["某某奇怪屬性名"]="某某奇怪值";  
某變態東西.屬性集合["某某變態屬性名"]="某某變態值";  
這樣存儲。 
再比如: 
手機型號有幾千種,除了共同屬性外還有不同屬性有幾百個,屬性名和值類型都不一樣,有的手機有這屬性,有的沒有。 
對於這樣的“多態”,我們就採用上面的設計結構。 
其效果相當於: 
某奇怪手機.屬性集合["某某奇怪屬性名"]="某某奇怪值"; 
某變態手機.屬性集合["某某變態屬性名"]="某某變態值"; 
界面特點:設置主表一行紀錄的屬性時候,要列出所有可能的屬性名稱,每個對應一個文本框。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章