包含结目的lu876所有页面,现在以wwWlu876com无法在显示了

在了解数据库设计的基本流程、規范以后为了学以致用,本节将以电子商务网站为例演示如何进行数据库设计。通过实际操作加深对数据库设计的理解。

电子商务網站是一种在互联网上开展电子商务的平台常见的电子商务网站有淘宝、天猫、京东、亚马逊等。一般来说电子商务网站最基本的功能是在线购物,它分为前台和后台后台面向网站的运营人员,用于录人数据前台面向访问网站的用户,用于选购商品下面通过表1列舉电子商务网站中的一些常见需求。

表1 电子商务网站需求说明

表1中列举的需求非常多但对于初学者来说,此时并不需要花费大量的时间研究这些商业领域的需求最重要的是掌握解决问题的方法。因此本节仅选取一些典型需求(带有*标注)进行详细讲解。有余力的读者可以嘗试解决其他需求

由于电子商务行业竞争激烈、需求变化快,往往对网站的开发时间要求比较严格希望网站能尽早上线。对于这样的需求可以采用迭代式开发,先追求小而精将核心功能优先完成,为后期的扩展预留空间然后再通过版本迭代逐渐发展成大而全。

在設计数据库时考虑到需求将来可能会发生变化的情况,应设计一个尽量能够适应需求变化的数据库其关键点如下。

(1) 避免数据经常发生變化将数据保存到数据库中后,数据是不会变的只有用户对数据进行修改时,数据才会发生变化在设计数据库时,应尽量保存不变嘚数据以减少修改数据带来的开销。例如在设计用户表时一般会保存出生日期而不是年龄,这是因为利用出生日期和当前日期可以推算出年龄而若保存年龄,数据每一年都需要发生一次改变

在实际开发中,经常会遇到一些数据被大量访问而该数据必须经过复杂的運算才能够获得的情况。例如在网站首页显示销量排名前10的商品,需要统计出所有商品的销量并降序排列然后取出前10条记录。当有大量用户同时访问首页时就会给数据库带来极大的负担,导致页面打开缓慢为此,可以利用Memcached、Redis等技术对热门数据进行缓存以减少数据庫的查询次数。读者可以查询相关资料了解这些技术

避免经常修改表结构。表结构的修改包括字段的增减、数据类型和约束的修改等對于已经上线的项目,修改表结构可能会导致服务暂停如果有更好的方案,则尽量避免修改表结构例如,在网站首页中增加一个显示嶊荐商品的功能时不必在商品表中增加一个“推荐”字段,而是专门创建一个“推荐商品”表其目的是将功能数据与商品数据分离。原因是商品数据一般不会发生变化而功能数据往往会随着功能的增加或减少而经常发生变化。“推荐商品”只是一个附加功能应尽可能减少其对商品数据产生的影响。

(3) 尽可能详细地记录日志利用日志记录数据的变化,可以为将来的功能增加提供数据基础例如,当网站用户的账号被盗时为了验明真实情况,需要确定账号被盗取的时间、登录的IP地址以及充值、消费、订单等数据是否发生过变化。若沒有记录日志则难以追溯。

避免删除数据对于已经上线的网站,删除数据是非常敏感的操作很有可能带来一些始料未及的后果。例洳用户因误操作删除了订单,希望恢复订单需要在项目中增加.订单回收站功能。若数据库中的订单记录已被删除即使增加了回收站功能,订单也无法恢复因此,在设计数据库时应考虑数据既可以被删除,又可以被恢复例如,在订单表中增加一个“是否删除”的芓段用来标识记录是否被删除。当查询订单时通过WHERE获取未被删除的订单,当查询订单回收站时通过WHERE获取已删除的订单

在MySQL中创建一个shop數据库,用来保存电子商务网站中的数据在创建数据库后,使用USEshop选择数据库具体SQL语句如下。

在对数据表命名时为了更好地区分项目,为所有的数据表加上“sh_”前缀例如,商品表命名为“sh_goods”

在实际开发中,使用各种编程语言编写应用程序访问数据库时最常见的问題是没有对用户输入的数据进行处理,直接使用字符串拼接到SQL中这样会导致用户输入的一些特殊字符(如单引号、反斜线、百分号等)被解析,破坏了原有SQL的语义出现SQL注入等安全问题。因此在编写应用程序时,一定要对特殊字符进行转义或者借助一些库或框架来完成处悝。

商品分类表用于保存分类名称、分类排序是否显示等信息并要求支持如图2所示的多级分类嵌套。

在图2中商品分类是树形结构,父汾类和子分类是一对多的关系接下来通过表2展示商品分类表的具体结构。

  • 分类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这是因为应用程序中习惯使用时间戳来保存时间,直接保存为INT类型会更加方便

下面根据表2所示的表结构,创建商品分类表具体SQL语句如下。

商品分类表创建完成后添加测试数据,具体SQL语句如下

在上述SQL语句中,测试数据一共包含16条分类记录层次關系如下。

办公-耗材-文具 电子产品-通讯-手机 电子产品-影音-音箱
电子产品-影音-耳机 电子产品一电脑-台式电脑 电子产品一电脑-笔记本
服装-女装-風衣 服装-女装-毛衣

商品分类与商品是一对多的联系一个分类中有多件商品商品表的具体结构如表3所示。

在表3中设计的商品表sh_goods共有21个字段具体说明如下。
? 商品id:主键使用无符号整型存储,自动增长
? 分类id:商品所属分类,使用无符号整型存储自动增长。
? SPU id:标准囮产品单元id(具体会在后面讲解)
? 编号:长度在20个字符以内。
? 名称:长度在120个字符以内
? 关键词:用于在搜索和浏览列表时更准確的找到该商品。
? 图片:用于在商品列表中显示商品的预览图保存图片路径。
? 提示:用于醒目的显示该商品的提示信息如促销信息、推荐语等。
? 描述:用于通过简短的文字描述商品的基本信息
? 详情:用于描述商品的详细信息。
? 评分:用户购买商品后的评分(1~5)此处为平均分,主要用于排序
? 价格、库存:商品的价格和库存。
? 是否上架、是否删除、是否包邮:0表示是1表示否。
? 销量計数、评论计数:商品的销量和评论数量主要用于排序。
? 上架时间:商品的上架时间主要用于排序。
? 创建时间:该商品被插入时嘚时间戳后台使用。
? 更新时间:该商品最后一次修改的时间戳后台使用。

(1)对于商品编号若没有特殊要求,一般情况下使用商品id作為编号但考虑到将来有可能更换另外一套规则来管理编号,因此这里预留了一个编号字段
由于商品分类是多级嵌套结构,一般来说商品所属的分类应该是叶子节点的分类。如果现有分类不能满足需求可以增加一个名称为“其他”的分类。
(3)用户上传的图片等文件一般是由Web服务器来管理的,数据库中只保存它们的引用路径

下面根据表3所示的表结构,创建商品表对应的SQL语句如下。

创建商品表后插囚测试数据,具体SQL语句如下


  

KeepingUnit,库存量单位)的概念它们可以简单理解为看待商品的两种不同的角度,SPU从信息聚合的角度看待商品SKU从库存管理的角度看待商品。例如一款饮料有500ml和750ml两种规格,对应的库存和价格不同它们是不同的SKU,在sh_goods表中每个SKU商品是一条商品记录在店鋪中展示商品时,如果按照SKU进行展示会出现大量冗余的信息(同一款饮料因为规格不同重复出现),不利于顾客挑选商品因此店铺通常会將相同款式的商品合并成SPU,如图2所示

在图2中,整个页面可以理解为一件SPU商品在页面中可以切换500ml和750ml,这两种规格的SKU商品当切换后,价格和库存也会发生变化
需要注意的是,图4-6演示的商品规格只有一个维度即容量,而有些商品的规格可能有多个维度如手机的规格可鉯分为网络、颜色、内存3个维度,如图3所示

由此可见,不同商品的规格维度不固定不同维度的规格项的数量也不固定。为了满足这种需求一般需要如下4张表才能够实现。

在上述表中sh_goods_spu保存SPU的id和名称,一个SPU包含多件商品sh_goods中的spu_id字段就表示该商品所属的SPU;sh_goods_spec保存规格,如“網络、颜色、内存”;sh_goods_specitem保存规格项如“移动、电信”,一个规格包含多个规格项;sh_goods_spec_set保存商品的规格项组合如“电信-白色-4GB”(实际保存的昰id)。
接下来通过表4~表7展示上述4张表的表结构

下面根据表4~表7所示的表结构,创建上述4张表对应的SQL语句如下。


数据表创建完成后为上述4張表添加测试数据;具体SQL语句如下。

在上述测试数据中goods_id为5的商品(智能手机)的规格项有“电信”“白色”和“4GB”,表示该商品的规格为“網络:电信颜色:白色,内存: 4GB”该商品和其他规格的商品组成了一个SPU,即sh_goods_spu表中id为1的“新款智能手机”

需要注意的是,在查询商品列表时如果直接查询sh_goods表中的记录,会导致一个SPU中的多个SKU商品都显示在列表中占用列表的空间,不利于挑选商品为了解决这个问题,可以按照表中的spu_id字段去除重复记录只保留一条商品记录即可。

在实际应用中考虑到多张表的查询操作过于复杂,有时会通过逆规范化的设计增加一些冗余字段以方便查询。例如在sh_goods_spu表中增加一个字段,将每个SPU相关的规格、规格项、规格组合以JSON格式编码后保存从而简化查询。

商品属性主要有两个作用一个是在商品展示页面中显示商品属性表格,一个是在商品列表页面中筛选商品分别如图4和图5所示。

需要紸意的是图4-8和图4-9中的属性是针对手机分类的商品设计的,而本项目有多种商品分类应为不同分类的商品设计不同的属性模板。
为了满足上述需求可以通过如下4张表来实现。

在上述表中sh_ goods_ attr 保存商品属性,一般有两个层级第1级如“主体、基本信息、主芯片”,第2级如“仩市年份、上市月份、机身颜色”;sh_goods_attr_value保存商品的属性值;sh_goods_selector 保存筛选条件一般有2~3级,2级如“机身内存——8GB以下”3级如“高级选项-网络-电信”;sh_goods_selector_value保存商品的筛选值。

严格来说sh_goods_attr和sh_goods_selector表中的category_id字段存在冗余,因为商品属性存在层级关系当通过category_id查找商品属性时,首先找到父属性嘫后通过父属性找到子属性,此时子属性的category_id是没有意义的它的值和父属性的category_id字段相同。若要消除冗余应将父属性和子属性拆分成两张表,但这里为了简化操作没有进行拆分,在实际开发中应避免这个冗余字段出现问题

接下来通过表8~表11展示上述4张表的表结构。

下面根據表4-8~表4-11所示的表结构创建上述4张表对应的SQL语句如下。


完成数据表的创建后为上述4张表添加测试数据,具体SQL语句如下

若希望筛选范围昰一个区间(如手机的存储容量有1G、2G、4G等选择),有两种实现思路一种是使用描述范围(如“2G以上”“1G~2G”)作为筛选项,另一种是在sh_goods_selector_value表Φ增加一个数字类型的字段专门保存数字类型的属性值,在查询时使用大于、小于运算符来表示一个区间

由于网站分为前后台,这里所说的用户是指前台用户也就是网站的访客通过注册账号成为网站的用户。一般来说数据库中的用户表包含两类信息,一类是登录信息即账号和密码,账号通常是编号、用户名、邮箱或手机号等具有唯一性的值;另一类是用户的个人信息如姓名、性别、出生年月、所茬地等。

接下来通过表12展示用户表的具体结构

下面根据表4-23所示的表结构,完成用户表的创建对应的SQL语句如下。

需要注意的是考虑到Web項目的安全性,应对用户的密码进行加密不能明文存储,否则一旦发生数据泄露将会给网站带来极大的损失。密码的加密方式有很多比较常见的是MD5加密算法,下面通过具体SQL语句进行演示


  

在上述SQL语句中,MD5(‘password’)表示使用MD5()函数对password字符串进行MD5(消息摘要算法第五版)运算运算嘚结果是一个字符串,由32个字符构成CONCAT()函数用于字符串拼接,此处是在MD5(‘password’)运算获得的字符串基础上拼接了salt字.符串最后,再次使用MD5()函数對拼接结果进行一次MD5运算

MD5算法具有不可逆性,通过计算后的结果将无法还原成原文而对于完全相同的内容,其计算后的结果也是相同嘚因此MD5算法经常用于密码的存储。但这种方式也有缺点如果将世界上所有的密码与计算结果全部存储起来进行检索,则密码就会被逆姠查找出来为了解决这个问题,通常会为每个用户生成一个salt( 盐)用于在对密码进行MD5计算时加入salt,以提高密码加密的复杂度使密码更不嫆易被破解。

用户表创建完成后为用户表添加测试数据,具体SQL语句如下

在上述测试数据中,password字段对密码进行了加密其中123是密码原文,Alex和Bill的密码相同但salt不同,所以密码的加密结果也不同在实际开发中,读者可以借助一些函数生成一个随机字符串作为salt使用,如MD5(RAND())
接丅来查看sh_ user 表中的记录,观察密码加密结果如下所示。

当用户购买商品后可以发表评论。对于已经发表的评论可以进行追加。商品评論表的具体结构如表13所示

在表13中,is_staff字段表示该评论是否为网站的后台用户(即工作人员)发表的用于工作人员回复用户的评论、解答疑问等。

下面根据表13的结构创建商品评论表,对应的SQL语句如下

数据表创建完成后,为商品评论表添加测试数据具体SQL语句如下。


超全面的測试IT技术课程0元立即加入学习!有需要的朋友戳:

欢迎转载,但未经作者同意请保留此段声明并在文章页面明显位置给出原文链接。

我要回帖

更多关于 www.6.cn 的文章

 

随机推荐