最新公告
  • 新注册用户请前往个人中心绑定邮箱以便接收相关凭证邮件!!!点击前往个人中心
  • 从零到企业级SSM电商项目实战教程(八)数据表结构设计

    用户表

    DROP TABLE IF EXISTS `mmall_user`;
    CREATE TABLE `mmall_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表id',
      `username` varchar(50) NOT NULL COMMENT '用户名',
      `password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密',
      `email` varchar(50) DEFAULT NULL,
      `phone` varchar(20) DEFAULT NULL,
      `question` varchar(100) DEFAULT NULL COMMENT '找回密码问题',
      `answer` varchar(100) DEFAULT NULL COMMENT '找回密码答案',
      `role` int(4) NOT NULL COMMENT '角色0-管理员,1-普通用户',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `update_time` datetime NOT NULL COMMENT '最后一次更新时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `user_name_unique` (`username`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
    

    这个就是我们项目的用户表,主键id自增长,用户名username在注册的时候是不允许用户名重复的,并发的时候,我们可以通过锁的机制来解决这种问题。

    例如我们查询某个用户名是否存在,我们可以用同步方法,但是当我们架构变成了一个分布式的时候,这种方法就不可取了。

    所以我们还是通过数据库的唯一索引UNIQUE KEY 然后通过BTREE这种方式将username设置为唯一索引,这样对于username的唯一确定性就交给mysql

    在业务代码处理时就不需要去加一些锁或者同步方法来校验用户名是否存在。

    密码存放的是MD5加密值,通过字段看不出原来的密码是多少,并且这也是一个非对称加密。

    分类表

    DROP TABLE IF EXISTS `mmall_category`;
    CREATE TABLE `mmall_category` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类别Id',
      `parent_id` int(11) DEFAULT NULL COMMENT '父类别id当id=0时说明是根节点,一级类别',
      `name` varchar(50) DEFAULT NULL COMMENT '类别名称',
      `status` tinyint(1) DEFAULT '1' COMMENT '类别状态1-正常,2-已废弃',
      `sort_order` int(4) DEFAULT NULL COMMENT '排序编号,同类展示顺序,数值相等则自然排序',
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `update_time` datetime DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=100032 DEFAULT CHARSET=utf8;
    

    设计分类表要考虑一个场景,就是这个表要可以递归,并且这个树状结构为了以后扩展,分类有可能是无限层级扩展的。

    在我们设计递归的时候一定要有一个结束条件,结束条件就把parent_id为0认为是结束,比如某些分类parent_id是0就说明它是根节点。

    产品表

    DROP TABLE IF EXISTS `mmall_product`;
    CREATE TABLE `mmall_product` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
      `category_id` int(11) NOT NULL COMMENT '分类id,对应mmall_category表的主键',
      `name` varchar(100) NOT NULL COMMENT '商品名称',
      `subtitle` varchar(200) DEFAULT NULL COMMENT '商品副标题',
      `main_image` varchar(500) DEFAULT NULL COMMENT '产品主图,url相对地址',
      `sub_images` text COMMENT '图片地址,json格式,扩展用',
      `detail` text COMMENT '商品详情',
      `price` decimal(20,2) NOT NULL COMMENT '价格,单位-元保留两位小数',
      `stock` int(11) NOT NULL COMMENT '库存数量',
      `status` int(6) DEFAULT '1' COMMENT '商品状态.1-在售 2-下架 3-删除',
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `update_time` datetime DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;
    

    注意这里用到的文本text类型的字段。

    购物车表

    DROP TABLE IF EXISTS `mmall_cart`;
    CREATE TABLE `mmall_cart` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL,
      `product_id` int(11) DEFAULT NULL COMMENT '商品id',
      `quantity` int(11) DEFAULT NULL COMMENT '数量',
      `checked` int(11) DEFAULT NULL COMMENT '是否选择,1=已勾选,0=未勾选',
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `update_time` datetime DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`),
      KEY `user_id_index` (`user_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=146 DEFAULT CHARSET=utf8;
    

    这里加了个user_id的索引,因为我们这个表经常使用user_id进行查询,这样会提高一下我们这个表的查询效率。

    支付信息表

    DROP TABLE IF EXISTS `mmall_pay_info`;
    CREATE TABLE `mmall_pay_info` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) DEFAULT NULL COMMENT '用户id',
      `order_no` bigint(20) DEFAULT NULL COMMENT '订单号',
      `pay_platform` int(10) DEFAULT NULL COMMENT '支付平台:1-支付宝,2-微信',
      `platform_number` varchar(200) DEFAULT NULL COMMENT '支付宝支付流水号',
      `platform_status` varchar(20) DEFAULT NULL COMMENT '支付宝支付状态',
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `update_time` datetime DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;
    

    这个表以后的用处是非常大的,包括以后的对账,退款都会用到这个表。

    在我们生成订单,发起支付请求的时候,我们会生成远程的支付宝一个订单,就会存在这个platform_number里面,代表远程平台的一个支付流水号。

    订单表

    DROP TABLE IF EXISTS `mmall_order`;
    CREATE TABLE `mmall_order` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',
      `order_no` bigint(20) DEFAULT NULL COMMENT '订单号',
      `user_id` int(11) DEFAULT NULL COMMENT '用户id',
      `shipping_id` int(11) DEFAULT NULL,
      `payment` decimal(20,2) DEFAULT NULL COMMENT '实际付款金额,单位是元,保留两位小数',
      `payment_type` int(4) DEFAULT NULL COMMENT '支付类型,1-在线支付',
      `postage` int(10) DEFAULT NULL COMMENT '运费,单位是元',
      `status` int(10) DEFAULT NULL COMMENT '订单状态:0-已取消-10-未付款,20-已付款,40-已发货,50-交易成功,60-交易关闭',
      `payment_time` datetime DEFAULT NULL COMMENT '支付时间',
      `send_time` datetime DEFAULT NULL COMMENT '发货时间',
      `end_time` datetime DEFAULT NULL COMMENT '交易完成时间',
      `close_time` datetime DEFAULT NULL COMMENT '交易关闭时间',
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `update_time` datetime DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `order_no_index` (`order_no`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8;
    

    订单号我们也加了个唯一索引,不能生成多个相同订单造成订单重复。

    payment是实际付款金额,千万不要和产品里面的金额做成联动。

    例如现在我们已经购买了一个iPhone价格是6888,所以这里会存6888,当我们产品把6888修改成5000的时候,我们这个表还是存6888,所以它代表实际付款金额。

    订单明细表

    DROP TABLE IF EXISTS `mmall_order_item`;
    CREATE TABLE `mmall_order_item` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单子表id',
      `user_id` int(11) DEFAULT NULL,
      `order_no` bigint(20) DEFAULT NULL,
      `product_id` int(11) DEFAULT NULL COMMENT '商品id',
      `product_name` varchar(100) DEFAULT NULL COMMENT '商品名称',
      `product_image` varchar(500) DEFAULT NULL COMMENT '商品图片地址',
      `current_unit_price` decimal(20,2) DEFAULT NULL COMMENT '生成订单时的商品单价,单位是元,保留两位小数',
      `quantity` int(10) DEFAULT NULL COMMENT '商品数量',
      `total_price` decimal(20,2) DEFAULT NULL COMMENT '商品总价,单位是元,保留两位小数',
      `create_time` datetime DEFAULT NULL,
      `update_time` datetime DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `order_no_index` (`order_no`) USING BTREE,
      KEY `order_no_user_id_index` (`user_id`,`order_no`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=utf8;
    

    这里product_id是不能连接product表去查询name和image的,因为当我们下单的时候这个商品名称叫“双十一大促”,可能在查询订单明细的时候就变成了“iPhone”。

    所以可以简单理解成product_name和produc_image放在这里是有一个业务需求,比如说类似做一个快照。

    收货地址表

    DROP TABLE IF EXISTS `mmall_shipping`;
    CREATE TABLE `mmall_shipping` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) DEFAULT NULL COMMENT '用户id',
      `receiver_name` varchar(20) DEFAULT NULL COMMENT '收货姓名',
      `receiver_phone` varchar(20) DEFAULT NULL COMMENT '收货固定电话',
      `receiver_mobile` varchar(20) DEFAULT NULL COMMENT '收货移动电话',
      `receiver_province` varchar(20) DEFAULT NULL COMMENT '省份',
      `receiver_city` varchar(20) DEFAULT NULL COMMENT '城市',
      `receiver_district` varchar(20) DEFAULT NULL COMMENT '区/县',
      `receiver_address` varchar(200) DEFAULT NULL COMMENT '详细地址',
      `receiver_zip` varchar(6) DEFAULT NULL COMMENT '邮编',
      `create_time` datetime DEFAULT NULL,
      `update_time` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;
    

    收货地址表是我们项目里最简单的表,里面存的都是收货地址。

    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » 从零到企业级SSM电商项目实战教程(八)数据表结构设计

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    参与讨论

    • 176会员总数(位)
    • 3737资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 542稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级