一、实验目的
- 掌握在面向对象数据库设计过程中数据库设计文档的设计技巧和撰写方法,熟悉把握面向对象数据库设计的具体流程和设计环节。
- 在本实验的操作过程中,复习学过的数据库规范化,并利用规范化对数据库进行关系模式的划分。
- 重点把握面向对象数据库的概念模型设计与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设计的实现方法,以及数据库的模型设计过程