授课语音

商城项目设计数据库,创建商品、订单、用户等核心数据表

在商城项目中,数据库设计是至关重要的一部分,合理的数据库设计能够有效提高系统的性能和可维护性。本文将介绍如何设计商城项目的核心数据表,包括商品表、订单表和用户表,重点介绍表结构、字段设计和常见的关系。


1. 商品表(Product)

商品表主要存储商城中所有商品的基本信息,如商品名称、价格、库存、描述等。设计时需要考虑数据的一致性和查询的高效性。

商品表设计:

CREATE TABLE `product` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY, -- 商品ID,主键,自增长
  `name` VARCHAR(255) NOT NULL, -- 商品名称
  `description` TEXT, -- 商品描述
  `price` DECIMAL(10, 2) NOT NULL, -- 商品价格,精度为10,保留2位小数
  `stock` INT NOT NULL DEFAULT 0, -- 库存数量
  `category_id` BIGINT, -- 商品分类ID(外键)
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

代码案例:

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  // 商品ID
    private String name;  // 商品名称
    private String description;  // 商品描述
    private BigDecimal price;  // 商品价格
    private Integer stock;  // 库存数量
    private Long categoryId;  // 商品分类ID
    private LocalDateTime createdAt;  // 创建时间
    private LocalDateTime updatedAt;  // 更新时间
    
    // 省略getter和setter方法
}

代码解释:

  1. @Entity 注解表明这是一个JPA实体类。
  2. @Id 表示该字段是主键,@GeneratedValue 表示主键自动生成。
  3. 使用 BigDecimal 类型来处理商品的价格,避免浮点数精度丢失。
  4. LocalDateTime 用于存储时间戳,保证创建和更新的准确性。

2. 订单表(Order)

订单表存储用户提交的订单信息,包括订单号、订单状态、商品信息、订单金额等。

订单表设计:

CREATE TABLE `order` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY, -- 订单ID
  `order_number` VARCHAR(50) UNIQUE NOT NULL, -- 订单号,唯一
  `user_id` BIGINT, -- 用户ID(外键)
  `status` VARCHAR(50) DEFAULT 'PENDING', -- 订单状态(例如:待支付、已完成等)
  `total_amount` DECIMAL(10, 2) NOT NULL, -- 订单总金额
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

代码案例:

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  // 订单ID
    private String orderNumber;  // 订单号
    private Long userId;  // 用户ID
    private String status;  // 订单状态
    private BigDecimal totalAmount;  // 订单总金额
    private LocalDateTime createdAt;  // 创建时间
    private LocalDateTime updatedAt;  // 更新时间
    
    // 省略getter和setter方法
}

代码解释:

  1. order_number 字段用来生成唯一的订单号,使用 VARCHAR(50) 类型。
  2. status 字段表示订单的状态,默认为 PENDING(待支付)。
  3. total_amount 使用 BigDecimal 类型,确保金额计算的精确性。

3. 用户表(User)

用户表存储商城系统的用户信息,包括用户名、密码、联系方式等。对于敏感信息如密码,需要加密存储。

用户表设计:

CREATE TABLE `user` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY, -- 用户ID
  `username` VARCHAR(100) UNIQUE NOT NULL, -- 用户名,唯一
  `password` VARCHAR(255) NOT NULL, -- 密码(加密后)
  `email` VARCHAR(100), -- 邮箱
  `phone` VARCHAR(20), -- 手机号码
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

代码案例:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  // 用户ID
    private String username;  // 用户名
    private String password;  // 密码
    private String email;  // 邮箱
    private String phone;  // 手机号码
    private LocalDateTime createdAt;  // 创建时间
    private LocalDateTime updatedAt;  // 更新时间
    
    // 省略getter和setter方法
}

代码解释:

  1. 用户表中 password 字段需要加密存储,可以使用如 BCrypt 等加密算法处理。
  2. username 字段设为唯一,以确保每个用户有唯一的用户名。

4. 表间关系

  • 商品表和订单表之间通过订单商品关联表实现多对多的关系。
  • 用户表和订单表之间是多对一的关系,一个用户可以有多个订单。

结语

通过合理的数据库表设计,我们可以在商城项目中有效地管理商品、订单和用户数据。设计时要考虑数据的一致性、查询效率以及可扩展性,尤其是大规模的商城系统,良好的数据库设计将直接影响系统的性能与稳定性。

去1:1私密咨询

系列课程: