1. 程式人生 > >Java簡單部落格系統(一)基於實體聯絡模型設計資料庫

Java簡單部落格系統(一)基於實體聯絡模型設計資料庫

 

基本概念

簡單屬性:不能劃分為更小的部分(其他屬性)。

單值屬性:一個特定實體有隻有單獨的一個值。

派生屬性:可以從別的相關屬性或實體派生出來。

最簡單的部落格系統

(一)實體集:使用者,部落格,評論,實體及其屬性列出如下:

(二)聯絡集:

以上設計的實體集,聯絡集表示如下:(派生屬性不儲存,在需要時計算出來)

實體集:

user:包含屬性(useId,name,password,motto,points,registerDate)        
blog:包含屬性(blogId,authorName,title,content,blogType,createTime,views,likes)        
comment:包含屬性(commentId,

authorName,content,reviewTime)        

聯絡集:
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

,authorName,content,reviewTime)    
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

 

外碼約束