一、實驗目的
- 掌握在面向對象數據庫設計過程中數據庫設計文檔的設計技巧和撰寫方法,熟悉把握面向對象數據庫設計的具體流程和設計環節。
- 在本實驗的操作過程中,復習學過的數據庫規范化,並利用規范化對數據庫進行關系模式的划分。
- 重點把握面向對象數據庫的概念模型設計與PDM設計,以及數據庫的模型設計,即要求掌握數據庫邏輯設計階段所要運用的理論知識。
- 能從實驗背景中分析出項目的需求說明,同時能使用RQM對需求說明進行簡單的描述,提高對系統設計的分析能力。
二、實驗內容
實驗背景導入:
某公司接到一個網購系統的項目,任命你做該任務的數據庫設計師,對網購系統進行數據庫整體的設計。Webshop就是一個B2C模式的電子商城,該電子商務系統能夠實現包括前台用戶和后台管理兩大部分。
前台購物系統包括會員注冊、會員登錄、商品展示、商品搜索、購物車、產生訂單和會員資料修改等等功能。后台管理系統包括管理用戶、維護商品庫、處理訂單、維護會員信息和其他管理功能。
根據上述實驗背景的系統功能描述和實際業務分析,進行電子商城的數據庫相關設計,要求完成以下實驗需求:
①需求分析說明書。在數據庫設計初期,首先進行系統功能需求說明書編寫。
②OR模型設計。進入邏輯設計階段,進行實體關系模型的設計,將現實的系統經過抽象后通過E-R模型表現。
③由OR模型轉變成面向對象模型。將上述完成的CDM轉化為PDM模型。
④數據字典編寫。進入數據字典的編寫,對系統相關實體的屬性所取的類型確定,並以文檔的形式進行編寫保存。
三、實驗平台
軟件:POWER DESIGNER,WORD
四、實驗步驟
①需求分析說明書。
進行系統功能需求說明書編寫。本實驗使用POWER DESIGNER的Requirements Model進行功能需求說明,其中按照系統功能的角色分類進行描述說明。角色分別為:Admin_Model、Business_Model和Consumer_Model ,具體角色的功能詳見RQM設計結果,完成系統初步的功能需求說明文檔。關於POWER DESIGNER的具體使用方法這里不詳述。
②OR模型設計。
邏輯設計階段,需進行實體關系模型的設計,本實驗利用POWER DESIGNER的Free Model,將從①需求分析說明書中抽象出具體的實體對象,並依據抽象出的實體對象設計相關的對象間關系,最終完成實體關系模型的設計。
③由OR模型轉變成面向對象模型。使用面向對象數據庫模式定義語言,將上述所設計的實體關系模型進行轉換模型的轉換。
④數據字典編寫。
在對數據字典進行編寫時,以表的形式對系統相關實體的屬性和所取的類型進行記錄和保存,其中表頭包括:序號、數據項、數據類型、長度和是否為鍵,本實驗則按照類的形式分別對其進行描述,同時以文檔的形式進行編寫保存,最終完成數據字典的說明文檔。
五、運行結果
1.RQM
圖5-1 Consumer角色的RQM需求
圖5-2 Business角色的RQM需求
圖5-3 Admin角色的RQM需求1
圖5-3 Admin角色的RQM需求2
2.OR圖。
圖5-4 項目核心的OR模型
圖5-5 項目詳細的OR模型
3.面向對象數據庫模式
class User:Object(extent users,key User_ID){ attribute String User_ID; attribute String Birth; attribute String Address; attribute String Mobile; attribute String WeChat; attribute String Reputation; attribute String Hobby; attribute Integer Wages; attribute String Job; }; class Member extends User(extent members,key Member_ID){ attribute String Member_ID; attribute String Password; attribute String User_name; relationship Shopping_Cart exist inverse Shopping_Cart::existed; relationship Set<Good> buy inverse Good::bought; relationship Punish Appeal inverse Punish::Appealed; relationship Administrators Member_managemented inverse Administrators::Member_management; Membership_registration(in Member)raises<already_registration>;//會員注冊 Membership_logon(in User_name,Password)raises(login_failed);//會員登錄 Membership_Logout();//會員安全退出 Membership_Modifying_data(in Member);//會員資料修改 Membership_Appeal_Punish(in Member,Punish);//處罰申訴 Membership_search_business(in Business)raises(non_existent);//搜索商家 Membership_see_reputation(in Business,Punish)raises(non_existent);//查看商家信譽度 Membership_see_goods(in Business,Good)raises(non_existent);//查看商家商品 Membership_Purchase_goods(in Member,Good,Payment_status);//商品購買 Membership_Add_Shopping_Cart(in Member,Good,Shopping_Cart);//加入購物車 Membership_evaluate(in Member,Payment_status,Order,Evaluate)raises(no_purchase);//商品評價 Membership_append_Evaluate(in Member,Evaluate);//追加評論 Membership_remove_Evaluate(in Member,Evaluate)raises(already_remove);//刪除評價 }; class Business extends User(extent businesses,key Business_ID){ attribute String Business_ID; attribute String Password; attribute String User_name; relationship Set<Good> Release inverse Good::Released; relationship Administrators Busin_managemented inverse Administrators::Busin_management; relationship Punish Appeal inverse Punish::Appealed; Business_registration(in Business)raises<already_registration>;//商家注冊 Business_logon(in User_name,Password)raises(login_failed);//商家登錄 Business_Logout();//商家安全退出 Business_Modifying_data(in Business);//商家資料修改 Business_Appeal_Punish(in Business,Punish);//處罰申訴 Business_see_reputation(in Business,Punish)raises(non_existent);//查看信譽度 Business_add_goods(in Business,Good)raises(already_existent);//新品上架 Business_remove_goods(in Business,Good)raises(non_existent);//商品下架 Business_modify_details(in Business,Good);//修改商品詳情 Business_modify_Price(in Business,Good,Price);//修改商品價格 Business_modify_type(in Business,Good,Commodity_type);//修改商品分類 Business_reply_Evaluate(in Business,Evaluate);//回復評價 Business_remove_reply(in Business,Evaluate)raises(already_remove);//刪除回復 }; class Administrator extends User(extent administrators,key Admin_ID){ attribute String Admin_ID; attribute String Password; attribute String User_name; relationship Set<Order> Order_management inverse Order::Order_managemented; relationship Set<Good> Good_management inverse Good::Good_managemented; relationship Set<Evaluate> Comment_management inverse Evaluate::Comment_managemented; relationship Set<Business> Busin_management inverse Business::Busin_managemented; relationship Set<Punish> Busin_management inverse Punish::Busin_managemented; relationship Set<Member> Member_management inverse Member::Member_managemented; Administrator_registration(in Administrator)raises<already_registration>;//申請管理員 Administrator_logon(in User_name,Password)raises(login_failed);//管理員登錄 Administrator_Logout();//管理員安全退出 Administrator_Modifying_data(in Administrator);//管理員資料修改 Administrator_add_Member(in Member)raises<already_existent>;//添加會員 Administrator_remove_Member(in Member)raises<already_remove>;//刪除會員 Administrator_Modifying_Memberdata(in Member);//修改會員資料 Administrator_see_Member(in Member)raises<non_existent>;//查看會員信息 Administrator_search_Member(in Member)raises<non_existent>;//搜索會員 Administrator_Punish_Member(in Member,Punish);//處罰會員 Administrator_add_Business(in Business)raises<already_existent>;//添加商家 Administrator_remove_Business(in Business)raises<already_remove>;//刪除商家 Administrator_Modifying_Businessdata(in Business);//修改商家資料 Administrator_see_Business(in Business)raises<non_existent>;//查看商家信息 Administrator_search_Business(in Business)raises<non_existent>;//搜索商家 Administrator_Punish_Business(in Business,Punish);//處罰商家 Administrator_modify_details(in Good);//修改商品信息 Administrator_modify_type(in Good,Commodity_type);//修改商品類型 Administrator_remove_goods(in Good)raises(non_existent);//強制下架商品 Administrator_modify_Order(in Order);//修改訂單信息 Administrator_modify_Ordertype(in Order,Order_type);//強制修改訂單類型 Administrator_recovery_Order(in Order,Business);//恢復商家訂單 Administrator_recovery_Order(in Order,Member);//恢復用戶訂單 Administrator_remove_Order(in Order)raises(already_remove);//徹底刪除訂單 Administrator_reply_Evaluate(in Evaluate);//回復評價 Administrator_remove_reply(in Evaluate)raises(already_remove);//刪除回復 Administrator_remove_reply(in Evaluate)raises(already_remove);//強制刪除用戶評論 }; class Commodity_type:Object(extent commodity_types,key Commodity_type_ID){ attribute String Commodity_type_ID; attribute String Life; attribute String Fruits; attribute String Delicious_food; attribute String Drinks; attribute String snacks; attribute String office; attribute String Stationery; }; class Good extends Commodity_type(extent goods,key Good_ID){ attribute String Good_ID; attribute Double Price; attribute String Stock; attribute String details; relationship Payment_status pay inverse Payment_status::paid; relationship Set<Member> bought inverse Member::buy; relationship Set<Business> Released inverse Business::Release; relationship Set<Evaluate> commented inverse Evaluate::comment; relationship Administrators Good_managemented inverse Administrators::Good_management; Show_goods(in Good)raises(non_existent);//商品展示 Search_goods(in Good)raises(non_existent);//商品搜索 See_goods_details(in Good)raises(no_description);//查看商品詳情 }; class Shopping_Cart:Object(extent shopping_Carts,key Cart_ID){ attribute String Cart_ID; attribute String Add_time; attribute String Number; attribute String Good; attribute String Describe; relationship Set<Payment_status> paid inverse Payment_status::pay; relationship Member existed inverse Member::exist; Membership_Show_goods(in Shopping_Cart,Good)raises(non_existent);//查看購物車商品 Membership_modify_count(in Shopping_Cart,Number);//修改購物車商品購買數量 Membership_add_goods(in Shopping_Cart,Good)raises(already_add);//添加購物車商品 Membership_remove_goods(in Shopping_Cart,Good)raises(already_remove);//移除購物車商品 Membership_payment_goods(in Shopping_Cart,Good,Payment_status)raises(repeated_payment);//支付購物車商品 }; class Payment_type:Object(extent payment_types,key Payment_type_ID){ attribute String Payment_type_ID; attribute String WeChat; attribute String Alipay; }; class Payment_status extends Payment_type(extent payment_statuses,key Payment_status_ID){ attribute String Payment_status_ID; attribute String Unpaid; attribute String Paid; relationship Shopping_Cart pay inverse Shopping_Cart::paid; relationship Order generate inverse Order::generated; }; class Order_type:Object(extent order_types,key Order_type_ID){ attribute String Order_type_ID; attribute String Pending_payment; attribute String Tobe_shipped; attribute String Tobe_receivedGoods; attribute String Tobe_commented; }; class Order extends Order_type(extent orders,key Order_ID){ attribute String Order_ID; attribute Integer Number; attribute Double Total_price; attribute String Setup_time; relationship Payment_status generated inverse Payment_status::generate; relationship Administrators Order_managemented inverse Administrators::Order_management; order_details(in Order);//查看訂單詳情 remove_Order(in Order)raises(already_remove);//刪除訂單 search_order(in Order)raises(non_existent);//搜索訂單 }; class Evaluate:Object(extent evaluates,key Comment_ID){ attribute String Comment_ID; attribute String Prefix_muber; attribute String User; attribute String content; attribute String Suffix_muber; relationship Good comment inverse Good::commented; relationship Administrators Busin_managemented inverse Administrators::Busin_management; see_Evaluate(in Evaluate);//查看評價 }; class Punish:Object(extent punishs,key Punish_ID){ attribute String Punish_ID; attribute String Reputation_value; attribute String Punish; relationship Set<Member> Appealed inverse Member::Appeal; relationship Set<Business> Appealed inverse Business::Appeal; relationship Administrators Busin_managemented inverse Administrators::Busin_management; Administrator_Restricted_login(in Punish)raises(already_restricted);//限制登錄 Administrator_Reply_appeal(in Punish)raises(already_reply);//回復申訴 Administrator_Permanent_title(in Punish)raises(non_existent);//永久封號 Administrator_Modify_reputation(in Punish);//修改商家信譽度 Administrator_remove_Punish(in Punish)raises(already_remove);//解除處罰 };
4數據字典
表5-1 User用戶數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
User_ID |
VARCHAR |
11 |
是 |
02 |
Birth |
VARCHAR |
10 |
|
03 |
Address |
VARCHAR |
20 |
|
04 |
Mobile |
VARCHAR |
11 |
|
05 |
|
VARCHAR |
11 |
|
06 |
Reputation |
VARCHAR |
15 |
|
07 |
Hobby |
VARCHAR |
50 |
|
08 |
Wages |
INTEGER |
20 |
|
09 |
Job |
VARCHAR |
30 |
|
.
表5-2 Member會員數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Member_ID |
VARCHAR |
11 |
是 |
02 |
Password |
VARCHAR |
50 |
|
03 |
User_name |
VARCHAR |
11 |
|
表5-3 Business商家數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Business_ID |
VARCHAR |
11 |
是 |
02 |
Password |
VARCHAR |
50 |
|
03 |
User_name |
VARCHAR |
11 |
|
表5-4 Administrators管理員數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Admin_ID |
VARCHAR |
11 |
是 |
02 |
Password |
VARCHAR |
50 |
|
03 |
User_name |
VARCHAR |
11 |
|
表5-5 Good商品數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Good_ID |
VARCHAR |
11 |
是 |
02 |
Price |
DOUBLE |
5 |
|
03 |
Stock |
VARCHAR |
10 |
|
04 |
details |
VARCHAR |
100 |
|
表5-6 Commodity_type商品類型數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Commodity_type_ID |
VARCHAR |
11 |
是 |
02 |
Life |
VARCHAR |
10 |
|
03 |
Fruits |
VARCHAR |
5 |
|
04 |
Delicious_food |
VARCHAR |
10 |
|
05 |
Drinks |
VARCHAR |
6 |
|
06 |
snacks |
VARCHAR |
10 |
|
07 |
office |
VARCHAR |
8 |
|
08 |
Stationery |
VARCHAR |
10 |
|
表5-7 Shopping_Cart購物車數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Cart_ID |
VARCHAR |
11 |
是 |
02 |
Add_time |
VARCHAR |
20 |
|
03 |
Number |
VARCHAR |
100 |
|
04 |
Good |
VARCHAR |
20 |
|
05 |
Describe |
VARCHAR |
30 |
|
表5-8 Payment_type支付類型數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Payment_type_ID |
VARCHAR |
11 |
是 |
02 |
|
VARCHAR |
11 |
|
03 |
Alipay |
VARCHAR |
11 |
|
表5-9 Payment_status支付狀態數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Payment_status_ID |
VARCHAR |
11 |
是 |
02 |
Unpaid |
VARCHAR |
3 |
|
03 |
Paid |
VARCHAR |
3 |
|
表5-10 Order_type訂單類型數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Order_type_ID |
VARCHAR |
11 |
是 |
02 |
Pending_payment |
VARCHAR |
3 |
|
03 |
Tobe_shipped |
VARCHAR |
3 |
|
04 |
Tobe_receivedGoods |
VARCHAR |
3 |
|
05 |
Tobe_commented |
VARCHAR |
3 |
|
表5-11 Order訂單數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Order_ID |
VARCHAR |
11 |
是 |
02 |
Number |
INTEGER |
100 |
|
03 |
Total_price |
DOUBLE |
1000 |
|
04 |
Setup_time |
VARCHAR |
20 |
|
表5-12 Evaluate評價數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Comment_ID |
VARCHAR |
11 |
是 |
02 |
Prefix_muber |
VARCHAR |
11 |
|
03 |
User |
VARCHAR |
11 |
|
04 |
content |
VARCHAR |
20 |
|
05 |
Suffix_muber |
VARCHAR |
11 |
|
表5-13 Punish違規處罰數據字典
序號 |
數據項 |
數據類型 |
長度 |
是否為鍵 |
01 |
Punish_ID |
VARCHAR |
11 |
是 |
02 |
Reputation_value |
VARCHAR |
3 |
|
03 |
Punish |
VARCHAR |
2 |
|
六、實驗總結
通過本實驗,可將相關的總結和經驗收獲分點總結如下:
1、在進行RQM設計時,本實驗按照系統角色的方式對系統的功能和需求進行了划分,各個角色下可以存在相同功能方法。其中,對於弱權限的類操作方法,可在數據庫模式定義中直接放到該目標類中。如:Good類對於三個不同的角色都具有商品展示、商品搜索和查看商品詳情的功能,所以不需要考慮不同角色調用該類時發生權限所屬的問題,直接將其放到Good類中。
2、 對於角色的強所屬權限而言,必須放到其角色類內部,如:對於Administrator角色,其具有至高權限,為了權限不發生錯亂而將添加會員、刪除會員和刪除商家等功能放到Administrator角色類中,但前提是方法輸入的參數必須為整個對象類目標。
3、 對於面向對象數據庫模式的設計,可以存在方法也可以不使用方法,那本實驗為何要使用自定義的功能方法呢?首先,本實驗是將后台數據庫數據通過以自定義方法的方式進行封裝,方便在前台設計時直接調用該方法,同時也大大節約了前台的數據計算量。
4、 基本熟悉了在面向對象數據庫設計過程中數據庫設計文檔的設計技巧和撰寫方法,以及面向對象數據庫設計的具體流程和設計環節。
5、 在本實驗的操作過程中,復習了學過的數據庫規范化,並利用了規范化對數據庫進行基本的關系模式的划分。
6、 初步把握了面向對象數據庫的概念模型設計與PDM設計的實現方法,以及數據庫的模型設計過程