資料庫設計示範

by adonis 20. 十月 2015 09:57

作    者:楊先民
審    稿:張智凱


前言


本期的資料庫設計,是民國98年公務人員高等考試三級的考試
試題,其實算是相當的簡單,應該在你我上所謂的資料庫設計課
程常會看到的範例:論壇資料庫設計,就讓我們來看看這個資料庫該如何才能滿足使用者的需求吧!


題目

假設你想設計一個討論區系統,該系統需要維護的資料包括會
員(Member)、討論版(Forum)、主題文章(Article),和回應文章(Response)。

資料需求如下:
1.    會員(Member):包括帳號(account)、密碼(passwd)、姓名(name)、身份證字號(pId)和 email。其中帳號和身分證字號均為唯一。

2.討論版(Forum):包括版名(fName)和開版日期(startDate),其中版名為唯一。此外,每一討論版必須剛好有一位版主(Owner),版主為會員。

3.主題文章(Article):包括主題(aTitle)、張貼時間(aTime)、標籤(tags)和內容(content),其中標籤可以有多個。此外,每一篇主題文章必須由一位會員張貼(Creates),且必須屬於某個討論版,其中沒有任何屬性是唯一的,但張貼會員和張貼時間合起來是唯一的。

4.回應文章(Response):包括張貼時間(rTime)和內容(content),一篇回應文章必須是回應一篇主題文章,但一篇主題文章可有多篇回應文章。此外,一位會員可以有多篇回應文章,所回應的主題文章和張貼人也必須記載,張貼會員和張貼時間合起來是唯一的。

以下是一位同學所畫的實體關係圖(ERD):

image

(一)    請指出以上 ERD裡不符合資料需求的部分。
(二)    請修正該 ERD以滿足所有的資料需求。

這是一個滿特殊的考題,它並不是要你從頭設計到尾,而是畫了一張 ERD的圖給你(由考試所提供的 ERD圖,我們可以發現,果然資料庫設計各大門派林立,連 ERD的表示方式也各有不同,我書中的 ERD圖則是另外一種 ERD的呈現方式,不過能夠了解其意義最重要)。

我們分別看單獨的實體,一個個檢討後再看彼此間的關聯,首先是會員資料,很明顯少了身份證字號的屬性 pId,需要把它加進去。

接下來是討論版(Forum):fName版名為唯一值,所以需要在下面劃底線,而版主(Owner)也是會員,這點並沒有辦法透過這張圖看的出來。

主題文章(Article):「其中標籤(tag)有多個」,這個屬於「多值屬性」,但畫出來的圖是只有單圈屬性,應該是雙圈,如下圖:

image

所以 tag應該要畫成雙圈才是。

「每一篇主題文章必須由一位會員張貼(Creates)」,這裡有達成需求,因為畫成1對多的關係。
「且必須屬於某個討論版」,這裡和討論版之間是 M與 N,表示多對多,應該是 1與 M才對,不然主題文章不會只屬於某個討論版。
「其中沒有任何屬性是唯一的,但張貼會員和張貼時間合起來是唯一的」,這裡無法呈現張貼會員和張貼時間合起來是唯一的情況,因為並沒有張貼會員的屬性被列出,主題文章以本圖而言是只對會員關聯,但沒把它的屬性張貼會員加入。

回應文章:

「包括張貼時間(rTime)和內容(content)」,這點符合。
「一篇回應文章必須是回應一篇主題文章,但一篇主題文章可有多篇回應文章。」,回應文章之間的1與N應該對調,應該變成:

image

此外,一位會員可以有多篇回應文章,這時圖應該改成:

image

「所回應的主題文章和張貼人也必須記載」,這裡無法顯示。

「張貼會員和張貼時間合起來是唯一的」,同樣問題,回應文章並沒有張貼會員的資訊,所以也就沒有辦法和張貼時間合起來是唯一的設計。

第一大題大致上解題完畢,第二題則是要修正 ERD的圖,其實我比較喜歡就重新設計吧,用我上課時後教學的方式,現在既然已經有大致上的實體屬性,就延用下來吧,再稍微做一些修改,我把實體和屬性分別列出如下:

會員(Member): account、passwd、name、pId、email。
(pID為 unique)

討論版(Forum):fName、startDate。

此外,每一討論版必須剛好有一位版主(Owner),版主為會員。

所以畫出來的圖是長這樣子的:

image

這裡比較特殊,「剛好必需」有一位版主,所以 Member 和 Forum之間是 1(從1開始)對1的關係。

我是比較習慣畫成這樣的 ERD的圖,也許是這樣在考試上有被扣分吧,其實這些都只是工具,重要的是你會不會設計才是。

主題文章 Article(aTitle、aTime、tags、content)。
其中 tags可以有多個,基本上屬性不能有多值,要嘛改情境改成單一值,要嘛把 tags升級成實體,以本例升級成實體和 Article有關聯,至於是怎樣的關聯呢? 因為一個文章會有多個 tags,而一個 tags也可能會標多個 Article,所以應該是個多對多的關係,然而我們現在尚未定義 Article的主鍵,所以先把圖畫成如下:

image

再來檢討 Article該設定什麼主索引鍵。

「此外,每一篇主題文章必須由一位會員張貼(Creates),且必須屬於某個討論版,其中沒有任何屬性是唯一的,但張貼會員和張貼時間合起來是唯一的。」

所以會員和文章有關聯,一位會員張貼多篇文章,而這篇文章必須由一位會員張貼,所以變成這樣:

image

需要選定一個主鍵了,如果按題意,張貼會員和張貼時間是唯一的,我們要把 aTime與 Account這兩個屬性設定成複合主索引鍵,但實務上我是建議各位採用替代鍵的方式,不要傻傻的真的用複合鍵,因為 Article和 tags還有多對多的關聯呢,所以我的建議是這樣:

image

是的,增設一個 article_id,定義它是主鍵,這樣它就不會重複了,另外和tags之間的多對多關係也能解了。

image

回應文章(Response):包括張貼時間(rTime)和內容(content),一篇回應文章必須是回應一篇主題文章,但一篇主題文章可有多篇回應文章。此外,一位會員可以有多篇回應文章,所回應的主題文章和張貼人也必須記載,張貼會員和張貼時間合起來是唯一的。

這個其實就是如法泡製,也在 Response上設定一個替代鍵,關聯到 Article以及會員實體,幸好本題的回應文章只能回應 Article,而不是可以回應 Response,不然設定方式肯定要改變了,設計圖如下:

image

最後最後,全部設計出來的 ERD應該長的如下:

image

檢查看看,應該沒有哪個地方有問題呢?不過如果實務上我要設計討論區,應該不會使用這個情境的(笑),而且本例也只是個考試,少了很多東西,例如限制會員有一些版面無法看之類的,這個又要再加設定在上面了。

LAST

Tags:

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

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

月分類Month List