经过上一小节的需求分析,我们将系统分为了鉴权模块、商品模块和分类模块,本节中,我们将围绕功能模块,进行数据库设计。你将学习到实际开发中的一些数据库设计技巧。请确保在你的开发环境下,已经准备好了一个 MySQL数据库。

1. 创建库

首先,我们先给商品管理项目创建一个数据库,命名为im_goods_cms,cms为Content Management System(内容管理系统)的缩写。
链接数据库,执行以下 SQL:

  1. CREATE DATABASE `im_goods_cms` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';

2. 创建表

2.1 通用字段

有一定数据库设计经验的同学都知道,一个数据库中的数据表都会有一些通用字段。关于通用字段有哪些、如何命名以及如何选定字段类型都有一定的套路,不仅受个人开发习惯的影响,也受到团队开发规范的约束。
该项目,所有的数据表都包含以下字段:

字段名称 字段类型 字段长度 允许为 NULL 默认值 注释
id int 0 表主键,自增长
create_time timestamp - CURRENT_TIMESTAMP 创建时间
update_time timestamp - CURRENT_TIMESTAMP 更新时间
delete_time timestamp - 删除时间

另外,除了通用字段,该项目中的所有表都以im开头。

2.2 用户表

由于该系统鉴权模块使用用户名和密码进行鉴权,需要设计一个用户表im_user,用户表包含如下字段(已省略通用字段):

字段名称 字段类型 字段长度 允许为 NULL 默认值 注释
nickname varchar 50 空字符串 昵称
username varchar 50 用户名
password char 32 密码

Tips:password字段的类型为char,这是因为我们在实现代码时,将使用MD5算法进行加密,加密后的密码长度为32,因此使用定长字符串更加节省存储空间。

链接MySQL并选择im_goods_cms数据库,执行以下 SQL:

  1. -- ----------------------------
  2. -- Table structure for im_user
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `im_user`;
  5. CREATE TABLE `im_user` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT "昵称",
  8. `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT "用户名",
  9. `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT "密码",
  10. `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  11. `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  12. `delete_time` timestamp(0) NULL DEFAULT NULL,
  13. PRIMARY KEY (`id`) USING BTREE
  14. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  15. -- ----------------------------
  16. -- Records of im_user
  17. -- ----------------------------
  18. INSERT INTO `im_user` VALUES (1, '小慕', 'admin', '123456', '2020-07-20 16:53:19', '2020-07-20 16:53:19', NULL);

2.3 商品表

商品模块需要一个商品表im_goods,商品表包含如下字段(已省略通用字段):

字段名称 字段类型 字段长度 允许为 NULL 默认值 注释
name varchar 100 商品名
description varchar 255 空字符串 简介
category_id int 11 0 分类id
price dicimal 10, 2 价格
stock int 11 0 库存

链接MySQL并选择im_goods_cms数据库,执行以下 SQL:

  1. -- ----------------------------
  2. -- Table structure for im_goods
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `im_goods`;
  5. CREATE TABLE `im_goods` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  8. `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
  9. `category_id` int(11) NULL DEFAULT 0,
  10. `price` decimal(10, 2) NOT NULL,
  11. `stock` int(11) NULL DEFAULT 0,
  12. `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  13. `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  14. `delete_time` timestamp(0) NULL DEFAULT NULL,
  15. PRIMARY KEY (`id`) USING BTREE
  16. ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  17. -- ----------------------------
  18. -- Records of im_goods
  19. -- ----------------------------
  20. INSERT INTO `im_goods` VALUES (1, '测试商品1', '', 0, 12.30, 3, '2020-07-20 16:53:19', '2020-07-20 16:53:19', NULL);
  21. INSERT INTO `im_goods` VALUES (2, '测试商品2', '', 0, 33.20, 10, '2020-07-20 17:17:53', '2020-07-20 17:17:53', NULL);
  22. INSERT INTO `im_goods` VALUES (3, '测试商品3', '', 0, 20.00, 50, '2020-07-20 17:18:09', '2020-07-20 17:18:09', NULL);

2.4 分类表

分类模块需要一个商品表im_category,分类表包含如下字段(已省略通用字段):

字段名称 字段类型 字段长度 允许为 NULL 默认值 注释
name varchar 100 商品名
description varchar 255 空字符串 简介

链接MySQL并选择im_goods_cms数据库,执行以下 SQL:

  1. -- ----------------------------
  2. -- Table structure for im_category
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `im_category`;
  5. CREATE TABLE `im_category` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  8. `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
  9. PRIMARY KEY (`id`) USING BTREE
  10. ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

至此,我们的数据库和表已经建立完成。

3. 小结

本小节,我们一起创建了数据库和表,表结构比较简单,大家可以去我的代码仓库找到SQL文件,并直接在你的数据库中执行,下一小节,我们将着手业务代码的实现。