新手成長之資料庫設計小範例(一)

by adonis 19. 二月 2018 19:43

作 者:楊先民 精誠資訊恆逸教育訓練中心 講師

前言

資料庫設計是一門學問,也是一個相當有挑戰性的工作,你會發現不同設計者會有不同的設計思考,同個情境也許會有各種不同的設計結果,這一系列的文章將會用相當短的小範例來說明這樣的資料庫需求你該如何設計,如何兼顧需求情境以及效能,最好是又能顧及資料庫的正規化。

閱讀本文之前

你必需要對資料庫設計有基礎的了解,本專欄不會再一個一個介紹資料庫設計的基本觀念,最好的資料庫入門書籍,是我在悅知出版社所出版的「實戰資料庫設計」,詳見網站http://www.delightpress.com.tw/book.aspx?book_id=SKUD00016

本文會分非常多期,而且會以非常小段且小範例的方式介紹這樣需求的資料庫該如何設計,設計資料庫和寫程式差不多,需要有範例,後人就可以拿這個範例設計相同類型的資料庫,或是以後有看到類似情境,就可以拿來套用,這也是為什麼一個資料庫設計師設計過的專案愈多,就愈能兼顧效能與需求,設計出一個完美的資料庫出來。

情境1:學生修輔系或雙學位的問題

這是一個簡單的校務系統,需要記錄學生是屬於哪個科系的,以及學生有修哪些輔系或是雙學位,該如何用資料庫表達呢?

由以上的說明可以發現,我們的文章走向就是這種非常小範例的資料庫設計,把大資料庫設計拆到最小,單純就某一個小需求判斷到底該如何設計,這樣所佔的文章篇幅也不至於太大。

若是一般人的話,可能會這樣設計:

學生

PK學號

姓名

基本資料…

輔系

雙學位

 

為何會說「一般人」會如此設計?因為很多人會認為用輔系來描述學生,或是用雙學位來描述學生實體是很合理的事情。

但是這裡必需說明一個觀念就是,輔系或是雙學位這個屬性,是否每個學生都有?在現在可能社會競爭更為激烈,所以每個大學生會修個輔系或是雙學位是很正常的,但平心而論輔系或雙學位並不常出現,如果真的要設計成輔系與雙學位屬性,勢必最後會造成一堆 null的。

所以,若是以校務系統來看的話,必需先確認一個學生究竟可以修多少輔系或是雙學位?原則上是沒有限制的,如果學校還允許畢業後的學生再回來修雙學位或輔系的話。

所以學生與輔系或雙學位的關係是1對多(從零開始),亦即1個人會修零個以上的雙學位或輔系,所以設計應該是如下才是:

學生

PK學號

姓名

基本資料…

輔系

雙學位

科系

PK系所編號

科系名稱

輔系

PK學號

PK系所編號

雙學位

PK學號

PK系所編號

 

如果該學生沒有修輔系或雙學位,則輔系以及雙學位的實體並不會被塞入資料,所以不用擔心資料暴增的問題。

但是,如果所設計的資料庫並不是校務系統,而是像104或是1111的話,設計方式可能會稍微改變一下,例如可能企業會要求有雙學位或是擁有輔系的求職者優先錄取,則求職者實體就可以設計成如下:

求職者

PK求職者編號

姓名

基本資料…

輔系與否

雙學位與否

 

如果有修輔系,則會填入 true,不然填入 false之類的,可以加速搜尋求職者身份時的資料過濾,但校務系統可能就沒有這麼大的需求性。

情境2:客戶與產品之間的關係

假設目前有三種產品ABC,以及三個客戶123,希望設計資料庫能夠將所有交易資訊通通記錄下來,一個產品一天可能會有三個客戶購買,同時一個客戶一天購買同一產品的次數可能也不只一次。該如何設計會較有效率?

此問題若以實體的角度來看,可以粗分為產品實體與客戶實體,彼此有關聯性(交易資訊),而數量上則是屬於多對多的關聯(一個客戶可以買多個產品,而且是同一天,一個產品會被多個客戶所購買),所以要產生第三實體。

但基本的客戶與產品實體可以先產生出來:

產品

PK產品編號

產品名稱

訂價

數量

客戶

PK客戶編號

客戶姓名

 

而這兩個實體之間是多對多關聯,所以產生第三實體為交易記錄:

交易記錄

PK產品編號

PK客戶編號

交易日期

 

不過由於客戶一天可能買同個產品,所以交易記錄設計成產品編號與客戶編號為複合主鍵,可能還是會重複,這時有人會想這麼設計:

交易記錄

PK產品編號

PK客戶編號

PK交易日期時間

 

把原本的交易日期,改成交易日期時間,並且設計成產品編號、客戶編號、交易日期時間三個屬性為複合主鍵,以避免資料重複。

但是這樣會造成複合主鍵太過龐大的問題,極有可能造成效能上的問題,更何況交易記錄有經驗的人都知道,通常是公司資料庫最大宗的。

所以,這時就要拿出「代替鍵」來幫助我們解決問題,最好的設計方式應該是如下:

交易記錄

PK交易記錄編號

FK產品編號

FK客戶編號

交易日期

 

新增一個交易記錄編號,可以用流水號的方式,只要確定不重複即可,如此一來可以兼顧效能與使用者需求。

結語

本期之後將會介紹一連串有關資料庫設計方面的技巧,希望各位能夠多思考有關各種不同情境的資料庫設計問題,當然資料庫設計並沒有標準答案,但有一定的思考方式,希望能對各位的資料庫設計有所幫助。

Tags:

SQL Server資料庫 | 楊先民Adonis Young

不允許評論

NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List