MySQL数据库——案例:电⼦商务⽹站设计
⽬录
在了解数据库设计的基本流程、规范以后,为了学以致⽤,本节将以电⼦商务⽹站为例,演⽰如何进⾏数据库设计。通过实际操作,加深对数据库设计的理解。
1、需求分析
电⼦商务⽹站是⼀种在互联⽹上开展电⼦商务的平台,常见的电⼦商务⽹站有淘宝、天猫、京东、亚马逊等。⼀般来说,电⼦商务⽹站最基本的功能是在线购物,它分为前台和后台,后台⾯向⽹站的运营⼈员,⽤于录⼈数据,前台⾯向访问⽹站的⽤户,⽤于选购商品。下⾯通过表1列举电⼦商务⽹站中的⼀些常见需求。
表1 电⼦商务⽹站需求说明
表1中列举的需求⾮常多,但对于初学者来说,此时并不需要花费⼤量的时间研究这些商业领域的需求,最重要的是掌握解决问题的⽅法。因此,本节仅选取⼀些典型需求(带有*标注)进⾏详细讲解。有余⼒的读者可以尝试解决其他需求。
由于电⼦商务⾏业竞争激烈、需求变化快,往往对⽹站的开发时间要求⽐较严格,希望⽹站能尽早上线。对于这样的需求,可以采⽤迭代式开发,先追求⼩⽽精,将核⼼功能优先完成,为后期的扩展预留空间,然后再通过版本迭代逐渐发展成⼤⽽全。
在设计数据库时,考虑到需求将来可能会发⽣变化的情况,应设计⼀个尽量能够适应需求变化的数据库,其关键点如下。
(1) 避免数据经常发⽣变化。将数据保存到数据库中后,数据是不会变的,只有⽤户对数据进⾏修改时,数据才会发⽣变化。在设计数据库时,应尽量保存不变的数据,以减少修改数据带来的开销。例如,在设计⽤户表时⼀般会保存出⽣⽇期⽽不是年龄,这是因为利⽤出⽣⽇期和当前⽇期可以推算出年龄,⽽若保存年龄,数据每⼀年都需要发⽣⼀次改变。
在实际开发中,经常会遇到⼀些数据被⼤量访问,⽽该数据必须经过复杂的运算才能够获得的情况。例如,在⽹站⾸页显⽰销量排名前10的商品,需要统计出所有商品的销量并降序排列,然后取出前10条记录。当有⼤量⽤户同时访问⾸页时,就会给数据库带来极⼤的负担,导致页⾯打开缓慢。为此,
可以利⽤Memcached、Redis等技术对热门数据进⾏缓存,以减少数据库的查询次数。读者可以查询相关资料了解这些技术。
(2) 避免经常修改表结构。表结构的修改包括字段的增减、数据类型和约束的修改等。对于已经上线的项⽬,修改表结构可能会导致服务暂停,如果有更好的⽅案,则尽量避免修改表结构。例如,在⽹站⾸页中增加⼀个显⽰推荐商品的功能时,不必在商品表中增加⼀个“推荐”字段,⽽是专门创建⼀个“推荐商品”表。其⽬的是将功能数据与商品数据分离。原因是商品数据⼀般不会发⽣变化,⽽功能数据往往会随着功能的增加或减少⽽经常发⽣变化。“推荐商品”只是⼀个附加功能,应尽可能减少其对商品数据产⽣的影响。
weblogic的安装(3) 尽可能详细地记录⽇志。利⽤⽇志记录数据的变化,可以为将来的功能增加提供数据基础。例如,当⽹站⽤户的账号被盗时,为了验明真实情况,需要确定账号被盗取的时间、登录的IP地址,以及充值、消费、订单等数据是否发⽣过变化。若没有记录⽇志,则难以追溯。
(4) 避免删除数据。对于已经上线的⽹站,删除数据是⾮常敏感的操作,很有可能带来⼀些始料未及的后果。例如,⽤户因误操作删除了订单,希望恢复订单,需要在项⽬中增加.订单回收站功能。若数据库中的订单记录已被删除,即使增加了回收站功能,订单也⽆法恢复。因此,在设计数据库时,应考虑数据既可以被删除,⼜可以被恢复。例如,在订单表中增加⼀个“是否删除”的字段,⽤来标识记录是
否被删除。当查询订单时,通过WHERE获取未被删除的订单,当查询订单回收站时,通过WHERE获取已删除的订单
2、准备⼯作
在MySQL中创建⼀个shop数据库,⽤来保存电⼦商务⽹站中的数据。在创建数据库后,使⽤USEshop选择数据库,具体SQL语句如下。
mysql>CREATE DATABASE shop;
Query OK,1row affected (0.00 sec)
浏览器javascript要不要打开
mysql>USE shop;
Database changed
在对数据表命名时,为了更好地区分项⽬,为所有的数据表加上“sh_”前缀。例如,商品表命名为“sh_goods”。
⼩提⽰:
在实际开发中,使⽤各种编程语⾔编写应⽤程序访问数据库时,最常见的问题是没有对⽤户输⼊的数据进⾏处理,直接使⽤字符串拼接到SQL中,这样会导致⽤户输⼊的⼀些特殊字符(如单引号、反斜线、百分号等)被解析,破坏了原有SQL的语义,出现SQL注⼊等安全问题。因此,在编写应⽤程序时,⼀定要对特殊字符进⾏转义,或者借助⼀些库或框架来完成处理。
3、商品分类表
商品分类表⽤于保存分类名称、分类排序是否显⽰等信息,并要求⽀持如图2所⽰的多级分类嵌套。
图2 分类结构图
在图2中,商品分类是树形结构,⽗分类和⼦分类是⼀对多的关系。接下来通过表2展⽰商品分类表的具体结构。
表2 商品分类表(sh_goods_category)
在表2中设计的商品分类表sh_goods_category 共有7个字段,具体说明如下。
分类id,主键,使⽤⽆符号整型存储,⾃动增长。
上级分类id:保存上级分类的id,若值为0,表⽰上级分类是根节点。
名称,长度在100个字符以内。
排序:⽤于对同级分类进⾏排序,按照从⼩到⼤的顺序排列。
是否显⽰:0表⽰不显⽰,1表⽰显⽰。
创建时间:该分类被插⼊时的时间戳,后台使⽤。
更新时间:该分类的最后⼀次修改的时间戳,后台使⽤。
⼩提⽰:
(1)对于is_show字段,其数据类型选择TINYINT⽽不是ENUM,这是考虑到需求将来有可能会发⽣变化,ENMU类型在增加枚举值时
需要修改表结构,⽽TINYINT类型不需要修改表结构。
(2)如果⽗分类的is_show值为0,则该分类和它的⼦分类都不会显⽰。⼦分类必须满⾜⾃⾝is_show和⽗分类is_show都为1时才会显
⽰。
(3)对于create_time和update_time字段,其数据类型选择INT⽽不是TIMESTAMP,这是因为应⽤程序中习惯使⽤时间戳来保存时
fancybox显示图片信息
间,直接保存为INT类型会更加⽅便。
下⾯根据表2所⽰的表结构,创建商品分类表,具体SQL语句如下。
CREATE TABLE sh_goods_category (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT'分类id',
parent_id INT UNSIGNED NOT NULL DEFAULT0COMMENT'上级分类id',
name VARCHAR(100)NOT NULL DEFAULT''COMMENT'名称',
sort INT NOT NULL DEFAULT0COMMENT'排序',
is_show TINYINT UNSIGNED NOT NULL DEFAULT0COMMENT'是否显⽰',
create_time TINYINT UNSIGNED NOT NULL DEFAULT0COMMENT'创建时间',
update_time TINYINT UNSIGNED NOT NULL DEFAULT0COMMENT'更新时间'html5游戏培训
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
商品分类表创建完成后,添加测试数据,具体SQL语句如下。
INSERT INTO sh_goods_category (id, parent_id, name)VALUES
(1,0,'办公'),(2,1,'耗材'),(3,2,'⽂具'),
(4,0,'电⼦产品'),(5,4,'通讯'),(6,5,'⼿机'),
mysql语句分类(7,4,'影⾳'),(8,7,'⾳箱'),(9,7,'⽿机'),
(10,4,'电脑'),(11,10,'台式电脑'),(12,10,'笔记本'),
(13,0,'服装'),(14,13,'⼥装'),(15,14,'风⾐'),(16,14,'⽑⾐');
在上述SQL语句中,测试数据⼀共包含16条分类记录,层次关系如下。
办公-耗材-⽂具电⼦产品-通讯-⼿机电⼦产品-影⾳-⾳箱
安卓软件开发课程电⼦产品-影⾳-⽿机电⼦产品⼀电脑-台式电脑电⼦产品⼀电脑-笔记本
服装-⼥装-风⾐服装-⼥装-⽑⾐
4、商品表
商品分类与商品是⼀对多的联系⼀个分类中有多件商品。商品表的具体结构如表3所⽰。表3 商品表(sh_goods)
在表3中设计的商品表sh_goods共有21个字段,具体说明如下。
商品id:主键,使⽤⽆符号整型存储,⾃动增长。
分类id:商品所属分类,使⽤⽆符号整型存储,⾃动增长。
SPU id:标准化产品单元id(具体会在后⾯讲解)。
编号:长度在20个字符以内。
名称:长度在120个字符以内。
关键词:⽤于在搜索和浏览列表时更准确的到该商品。
图⽚:⽤于在商品列表中显⽰商品的预览图,保存图⽚路径。
提⽰:⽤于醒⽬的显⽰该商品的提⽰信息,如促销信息、推荐语等。
描述:⽤于通过简短的⽂字描述商品的基本信息。
详情:⽤于描述商品的详细信息。
评分:⽤户购买商品后的评分(1~5),此处为平均分,主要⽤于排序。
价格、库存:商品的价格和库存。
是否上架、是否删除、是否包邮:0表⽰是,1表⽰否。
销量计数、评论计数:商品的销量和评论数量,主要⽤于排序。
上架时间:商品的上架时间,主要⽤于排序。
创建时间:该商品被插⼊时的时间戳,后台使⽤。
更新时间:该商品最后⼀次修改的时间戳,后台使⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。