Java簡單部落格系統(一)基於實體聯絡模型設計資料庫
基本概念
簡單屬性:不能劃分為更小的部分(其他屬性)。
單值屬性:一個特定實體有隻有單獨的一個值。
派生屬性:可以從別的相關屬性或實體派生出來。
最簡單的部落格系統
(一)實體集:使用者,部落格,評論,實體及其屬性列出如下:
(二)聯絡集:
以上設計的實體集,聯絡集表示如下:(派生屬性不儲存,在需要時計算出來)
實體集:
user:包含屬性(useId,name,password,motto,points,registerDate)
blog:包含屬性(blogId,authorName,title,content,blogType,createTime,views,likes)
comment:包含屬性(commentId,
聯絡集:
user_blog:關聯使用者和部落格
user_comment:關聯使用者和評論
blog_comment:關聯部落格和評論
(三)實體聯絡模型轉化為關係模型
1.具有簡單屬性的強實體集的表示:該模式關係中每個元組同實體集E的一個實體相對應,強實體集的主碼就是生成的模式的主碼。
2.聯絡集的表示:模式中的屬性為參與該聯絡及的實體主碼集合和該聯絡描述性屬性(如果有)的並集主碼:
多對多的二元聯絡:參與實體集的主碼屬性的並集;
一對多:“多”的一方的實體集的主碼;
一對一:任一個實體集的主碼;
基於以上原則,得到的關係模式如下所示:
user((useId,name,password,motto,pointsregisterDate));
blog(blogId,authorName,title,content,blogType,createTime,views,likes)
comment(commentId
user_blog:(useId,blogId)
user_comment:(useId,commentId)
blog_comment:(blogId,commentId)
(四)模式的合併
1.實體集A到實體集B對映基數是多對一,聯絡集是AB,得到三個模式A,B,AB;
2.實體集A在聯絡中是全部參與的(即:實體集A中每個實體a都必須參與到聯絡AB中)
滿足以上條件,則可以將模式A和模式AB合併成包含兩個模式所有屬性並集的單個模式,合併後的主碼是A的主碼和AB主碼的並集。
模式合併後的外碼約束:
捨棄聯絡集AB參照實體集A的約束,僅保留聯絡集AB參照實體集B的約束,作為合併後模式的約束。
(四)基於資料庫正規化檢驗模式的設計
1.第一正規化:關係模式中的屬性都是簡單屬性和單值屬性,屬性不存在任何子結構,屬性域是原子,所以滿足1NF;
2.BC正規化:在關係模式blog和comment中,存在非平凡函式依賴userId->authorName,userId不是blog或者comment的主碼,所以是不滿足BCNF。
3.第三正規化:在非平凡函式依賴中,authorName-userId=authorName,不在關係模式blog或者comment任意一個候選碼中。(它們的候選碼分別是blogId和commentId) ,所以不滿足第三正規化。
(五)規範化和去規範化
"按照上面的分析,要滿足第三正規化,需要對blog和comment資料表進行模式分解:
blog(blogId,userId,title,content,blogType,createTime,views,likes);
comment(comentId,userId,blogId,content,reviewTime);
user(userId,authorName);
原先已經定義了一個user表,所以這裡忽略分解出來的模式,得到以下的模式:
user(useId,name,password,motto,points,registerDate);
blog(blogId,userId,title,content,blogType,createTime,views,likes)
comment(commentId,userId,blogId,content,reviewTime)
但在實際應用中,顯示部落格記錄總是需要顯示使用者名稱,如果部落格表沒有使用者名稱屬性,則在顯示時需要關聯使用者表進行查詢,這會使得頁面載入變慢,效能下降。所以在有些情況下,可以允許冗餘資訊的存在以提升效能。在這種情況下,如果使用者名稱改變了,則需要對部落格表進行批量更新。慶幸的是,在實際應用中,一般會設計成使用者名稱唯一且不可變的。所以在這裡可以去規範化,保留部落格表中的使用者名稱。
(六)其他
是否應該建立部落格型別(bookType)表?
如果有將部落格進行分類顯示的需求,則應該建立部落格型別資料表;如果沒有這個需求,則可以不建立。
(七)藉助SQLyog工具建立資料庫db_blog,三個資料表及外來鍵約束
使用者表:user
部落格表:blog
外碼約束
評論表:comment
外碼約束