数据库设计
几乎所有的WEB项目都是基于数据库的,这使得数据的设计在整个项目中的地位举足轻重。相关研究表明,在数据应用系统的开发中,项目成功50%靠数据库的设计。良好的数据设计往往能够减少开发的负担。
数据库设计是指对于一个给定的应用环境,通过合理的逻辑设计和有效的物理设计来构造较优的数据库模式,建立数据库极其应用系统,满足用户的各种信息需求。
从数据应用系统和开发的全过程来考虑,数据库的设计可分为六个阶段:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库的运行与维护,按照这样的设计过程,数据库结构设计的不同阶段可形成数据库的各级模式。数据库设计的核心问题是如何从系统的观点出发建立一个数据库模式。一个良好的数据库应该充分反映物流发展变化的状况,充分满足组织的各级管理要求,同时还应该使后继系统开发工作方便、快捷,系统开发小,易于管理和维护。在物理设计阶段根据DBMS的特点和处理要求,进行物理储存安排。
1、数据库需求分析
eshop是一个典型的电子商务系统,针对它将要实现的业务功能,数据库中应该具有以下的模块:
(1)用户信息:其中应该包括用户编号、用户名、密码、账户金额、姓名、地址等内容。
(2)商品信息:包括商品编号、商品名称、商品价格、描述以及所属类别等。
(3)购物车:用来存储用户购物的信息,如商品编号、数量等。
(4)订单:一笔完整的订单记录应该包括它所相关商品集合以及各个商品的数量等信息。
(5)管理员信息:与用户信息类似,包括管理员编号、登录名、密码、角色类别等。
(6)管理员日志:包括日志编号、发生事件以及时间。
2、数据库概念结构设计
在数据库技术中,我们用模型的概念描述数据库的结构与语义,对现实世界进行抽象。表示实体类型及实体间联系的模型称为“数据模型”,其中之一就是实体联系模型(ER模型)。ER模型是独立于计算机系统的模型,完全不涉及信息在系统中的表示,只是用来描述某个特定组织关心的信息结构,这类模型称为“概念数据模型” 。
在电子购物商城系统中,存在用户、商品、购物车、订单、管理员等几个对象实体,以上述实体为例,一个用户对应多个商品,同时一个商品属于多个用户;一个用户对应多个购物车,同时一个购物车只属于一个用户;一个用户对应多个订单,一个订单只能属于一个用户;一个商品对应多个购物车,一个购物车对应多个商品;一个商品对应多个订单,一个订单对应多个商品;一个订单对应多个购物车,一个购物车只能属于一个订单;一个管理员对应多个用户、商品、购物车、订单,一个用户、商品、购物车、订单只能属于一个管理员。
由此可知用户和购物车之间、用户和订单之间、订单和购物车之间、管理员和用户、商品、购物车、订单之间都是一对多的关系;商品和购物车之间、用户和商品之间是多对多的关系。
根据上述分析可对应的实体.关系图如下:如图4.5所示用户和商品、订单之间的局部ER图,图4.6所示商品、订单和购物车之间的局部ER图,图4.7所示各实体之间总体ER图。
3、数据库逻辑结构设计
通过E-R图分析,下面设计具体的逻辑结构。
所涉及到的主要实体集及其属性如下:
用户(UserID、UserName、UserPwd、UserRealName、Sex、Address 、Email、Zipcode)
商品(ProductID、ProductName、ProductPrice、Intro、CategoryID、ClickCount)
购物车(RecordID、CartID、ProductID、CreatedDate、Quantity)
订单(OrderID、UserID、OrderDate、ProductID、Quantity、UnitCost)
管理员(AdminID、LoginName、LoginPwd、RoleID、RoleName)
4、数据库物理结构设计
本系统共涉及到9个表,分别是:用户信息表UserInfo、商品信息表ProductInfo、商品类别字典表Category、购物车表ShoppingCart、订单表Orders、订单信息表OrderItems、管理员信息表Admin、管理员角色字典表AdminRole和管理员日志表AdminAction。
主要设计思想:
(1)尽管在需求分析中,商品类别仅仅是商品的一个属性,但数据库设计中一般将其分离出去创建单独的表。事实上,这是一种面向对象的思想,这种做法有利于系统的扩展,例如商城的管理者将要拓宽业务、推出某种新类型的商品早,这样的设计将令其变得异常容易。同样的思想也体现在Admin表和AdiminRole表的设计中。
(2)由于订单可能包括多种商品,而且数量不一,所以用两个表来共同体现订单这个实体。在Orders表中存放订单的基本信息:订单号、所属用户的编号以及下订单的时间。而在OrderItems表中则存放订单的具体信息,每条记录体现某个订单所包含的某种商品的购买信息。
在本系统中数据库具体表结构的设计:
(1)用户基本信息表 UserInfo
用户信息表用来记录用户的一些基本信息,其结构如表4.1所示。
表4.1 UserInfo的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | UserID | Int | 用户ID(主键) |
2 | UserName | Nvarchar(50) | 用户登录名 |
3 | UserPwd | Nvarchar(50) | 用户密码 |
4 | Question | Nvarchar(50) | 密码提示问题 |
5 | Answer | Nvarchar(50) | 密码提示问题答案 |
6 | Acount | Decimal | 账户金额 |
7 | UserRealName | Nvarchar(50) | 用户真实姓名 |
8 | Sex | Nvarchar(50) | 性别 |
9 | Address | Nvarchar(50) | 地址 |
10 | | Nvarchar(50) | 电子邮件 |
11 | Zipcode | Nvarchar(50) | 邮编 |
(2)商品信息表 ProductInfo
商品信息表表示商品的基本信息,如表4.2所示。
表4.2 ProductInfo的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | ProductID | Int | 商品编号(主键) |
2 | ProductName | Nvarchar(50) | 商品名称 |
3 | ProductPrice | Decimal | 价格 |
4 | Intro | Nvarchar(50) | 商品介绍 |
5 | CategoryID | Int | 所属分类编号 |
6 | ClickCount | Int | 点击数 |
(3)商品分类表 Category
商品分类表用来表示商品类别信息。其结构如表4.3所示。
表4.3 Category的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | CategoryID | Int | 商品分类ID(主键) |
2 | CategoryName | Nvarchar(50) | 分类名称 |
(4)购物车表 ShoppingCart
购物车表用来存储用户购物的信息。其结构如表4.4所示。
表4.4 ShopingCart的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | RecordID | Int | 记录ID(主键) |
2 | CartID | Nvarchar(50) | 购物车ID |
3 | ProductID | Int | 所购商品编号 |
4 | CreatedDate | DateTime | 购物时间 |
5 | Quantity | Int | 购买数量 |
(5)订单表 Orders
订单表保存每笔订单的基本信息。结构如表4.5所示。
表4.5 Orders的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | OrderID | Int | 订单号(主键) |
2 | UserID | Int | 所属用户ID |
3 | OrderDate | DateTime | 成交时间 |
(6)订单详细信息表 OrderItems
订单详细信息表体现订单的细则,结构如表4.6所示。
表4.6 OrderItems的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | OrderId | Int | 所属订单号(主键) |
2 | ProductID | Int | 商品ID(主键) |
3 | Quantity | Int | 该商品的购买数量 |
4 | UnitCost | Decimal | 该商品的单价 |
(7)管理员信息表 Admin
与用户信息表类似,管理员信息表用来保存管理员的基本信息,如表4.7所示。
表4.7 Admin的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | AdminID | Int | 管理员ID |
2 | LoginName | Nvarchar(50) | 管理员登录名 |
3 | LoginPwd | Nvarchar(50) | 管理员密码 |
4 | RoleID | Int | 管理员角色ID |
(8)管理员角色表 AdminRole
管理员角色表用来表示不同的管理员角色类别,如表4.8所示。
表4.8 AdminRole的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | RoleID | Int | 角色ID(主键) |
2 | RoleName | Nvarcha(50) | 角色名称 |
(9)管理员日志表 AdminAction
管理员日志表表示管理员操作的每一条记录,如表4.9所示。
表4.9 AdminAction的结构
编号 | 字段名称 | 数据类型 | 说明 |
1 | ActionID | Int | 日志ID(主键) |
2 | Action | Nvarchar(50) | 角色名称 |
3 | ActionDate | DateTime | 日志时间 |
4 | AdminID | Int | 所属管理员编号 |
5、数据库设计图
设计的各数据表之间的关系如图4.8所示。
UserInfo | |
PK | UserId |
UserName UserPwd Question Answer Acount UserRealName Sex Address Zipcode |
AdminRole | |
PK | RoleId |
RoleName |
Category | |
PK | CategoryId |
CategoryName |
ProductInfo | |
PK | ProductId |
FK1 | ProductName ProductPrice Intro CategoryID ClickCount |
Admin | |
PK | AdminID |
FK1 | LoginName LoginPwd RoleId |
Order | |
PK | OrderId |
FK1 | UserID OrderDate |
AdminAction | |
PK | ActionId |
FK1 | Action ActionDate AdminID |
ShoppingCart | |
PK | RecordId |
FK1 | CartId ProductID Quantity CreateDate |
OrderItems | |
PK,FK1 PK,FK2 | OrderId ProductID |
Quantity UnitCost |
图4.8 数据库设计图
数据库设计图说明如下:
PK(Primary Key)为主键,FK(Foreign Key)为外键,箭头代表两个表之间的关系,即某个表的PK与另一个表的FK之间的对应关系。