數據庫表設計總結


一、實體與表對應關系

表<=>實體,字段<=>屬性。

 

二、表與表的關系(實體間的關系):一對一、一對多、多對多

一對一:一條記錄只對應其他表中的一條記錄有關系

學生基本信息表t_student,成績表t_studentScore含有一個外鍵studentId。基本信息表中的studentId和成績表中的studentId就是一對一的關系。

一對多:A表一條記錄對應B表中多條記錄有關系,B表的記錄不被A表記錄共享(有關系)。

班級表和學生表,一個班級有多個學生,對班級來說就是一對多的關系。

多對多:A表一條記錄和B表多條記錄有關系,B表的一條記錄也和A表的多條記錄有關系(互相共享)。

學生表和科目表,學生可以選擇多個科目,每個科目可以被多個學生選擇。

三、基本表的完整性

(1)原子性。字段是不可再分解的。
(2)原始性。記錄是原始數據(基礎數據)的記錄。
(3)穩定性。結構是相對穩定的,表中的記錄是要長期保存的。
(4)演繹性。由基本表與代碼表中的數據,可以派生出所有的輸出數據。

 

四、其他常用表

1.中間表

中間表是針對多對多關系的。就比如做公交查詢系統,里面有兩個表,分別是車站表t_busstation、線路表t_road,根據常識,一個站有多個線路經過,而每個線路又有多個車站,怎么才能將兩個表聯系起來呢,如果是一對一,一對多,我們一個表, 兩個表就可以將他們實現了。但是多對多呢,這樣我們就必須借助中間表用來連接兩個表。一般中間表只有一個自增主鍵+兩個表的主鍵。中間表是沒有屬性的因為它不是一個基本表。

 

2.臨時表

臨時表是那些以#號開頭為名字的數據表,它主要是用來存放臨時數據的,當用戶斷開連接但沒有清除臨時表里的數據時,系統會自動把臨時表里的數據清空。臨時表是放在系統數據庫 tempdb中而不是當前數據庫

 

臨時表分兩種:本地臨時表和全局臨時表。

a.本地臨時表

本地臨時表是以#開頭的,只對當前的數據庫用戶可見,而其他的用戶是不可見的。當數據庫實例斷開后當然也就丟失了數據了,不管是顯式清空還是系統回收。

b.全局臨時表

以“##”開頭的,而且是對所有的用戶都是可見,當你斷開數據庫實例連接時,只要還有別的系統項目在引用它,連着數據庫,那么數據就存在,只有當別的系統也全部斷開連接時,系統才會清除全局臨時表的數據。

 

建立臨時表的語句:

 本地臨時表:
 create table #student
(
  studentID int ,
  studentName nvarchar (40),
  classID int
 )
 全局臨時表:
 create table ##student
(
  studentID int ,
  studentName nvarchar (40).
  classID int
 )      

也可以用SQL語句完成:

select * from employee into  #student

 

五、三大范式


第一范式:如果每列(或者每個屬性)都是不可再分的最小數據單元(也稱為最小的原子單元),則滿足第一范式.比如一個工人的基本信息表,里面有工人的工號,性別,年齡,這些屬性都是不可分割的,所以這個表就符合了第一范式。

第二范式: 就是在第一范式的基礎上延伸,使之表里的每個字段都與主鍵發生關系。假如一個關系滿足第一范式,並且除了主鍵以外的其它字段,都依賴於該主鍵,則滿足第二范式.
例如:訂單表(訂單編號、產品編號、定購日期、價格、……),"訂單編號"為主鍵,"產品編號"和主鍵列沒有直接的關系,即"產品編號"列不依賴於主鍵列,這個列我們就可以把它刪除。

第三范式:在第二范式的基礎上更進一步,也就是為了實現表里的列都與主鍵列直接相關,不是間接相關。這個我們可以用“Armstrong 公理”中的傳遞規則來推理。

定義:
設U是關系模式R 的屬性集,F 是R 上成立的只涉及U 中屬性的函數依賴集。若X→Y 和 Y→Z在R 上成立,則X →Z 在R 上成立。因此我們就來看在網上搜索到的例子:例如:訂單表(訂單編號,定購日期,顧客編號,顧客姓名,……),初看該表沒有問題,滿足第二范式,每列都和主鍵列"訂單編號"相關,再細看你會發現"顧客姓名"和"顧客編號"相關,"顧客編號"和"訂單編號"又相關,最后經過傳遞依賴,"顧客姓名"也和"訂單編號"相關。為了滿足第三范式,應去掉"顧客姓名"列,放入客戶表中。

這里其實就是為了說明數據庫的表里步要出現冗余,在顧客表里已經有了"顧客姓名"了,而在訂單表里就別出現了,而直接根據顧客編號相關聯就可以,否則造成資源浪費。


三大范式延伸:

第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。

其實在設計數據庫的時候我們最多的要遵循的就是第三范式,但是並不是越滿足第三范式數據庫就設計的越完美,這種錯誤是錯誤的。有時候增加點冗余相反的會提高訪問速率,因此在實際的設計過程中應降低對范式的要求。

以前對數據冗余並不是很了解,在百度知道里的定義是這樣的:在一個數據集合中重復的數據稱為數據冗余. 但是不是說我們表的主鍵在其他表里重復出現就是冗余,這不是,而是為了連接兩個表。只有非鍵字段就是既不是主鍵外鍵等約束的鍵如果重復出現,就會形成數據冗余。數據冗余也包括重復性冗余和派生冗余。比如工人表里有"基本工資","獎金"兩列,然后還有一個"總工資"的列,這個總工資就是派生冗余。低級的重復性冗余一定要避免,杜絕,但是像派生冗余還是提倡的因為它能提高訪問的效率。

 

個人總結:

事物的屬性對應表的屬性,將一張表看作一個事物。如,書的屬性有價格、重量、等等。(一般表都有Id來區分每條記錄)

 

 更多閱讀:

數據庫設計:表的設計命名的十個注意點

數據庫設計經驗之談

SQL Server 數據庫設計


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM