tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 并发与锁相关

  • 对象与其他

  • 网络接口调用

  • 架构与设计

    • 景区门票管理和核销-1
      • 需求背景
        • 功能推演-1-简单版
        • 功能增加-订单包含多个产品
        • 修改后表
        • 功能增加-支持部分退
        • 订单表修改
        • 订单项表修改
        • 增加-退款记录表
        • 已使用字段的设计
        • 总结
        • 用户表
        • 门票表
        • 景点表
        • 订单表
        • 订单项信息表
        • 退款信息表
        • 功能增加-用户vip-优惠
      • 代码接口设计
  • 《踩坑与提升》记录
  • 架构与设计
EffectTang
2025-03-29
目录

景区门票管理和核销-1

# 景区门票管理和核销-1

# 需求背景

所有的架构与设计都是从简单渐渐演变到复杂的,也就是一步一步,随着要考虑功能的变多,而变得完善的。

现在要实现一个景区的门票的核销系统,应该怎么设计呢?或者说如何设计门票的售卖跟核销这2个功能,它对应的数据库应该如何设计,代码上可以设计什么接口,应该传递什么参数,有些地方需要抽象。

最后的最后,请记住,不要过度设计,也就是把一些你认为可能会使用的功能给实现,但可以预留一些扩展点。

# 功能推演-1-简单版

最简单的设计,一个景区,有门票,用户只有购买门票后才能进入。购买后,会生成订单,订单中包含用户和门票的绑定关系。

于是对象表应该有三个。

以下是每个表可能包含的字段参考:

CREATE TABLE User (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户唯一标识符',
    username VARCHAR(255) NOT NULL UNIQUE COMMENT '用户名或登录名',
    password_hash VARCHAR(255) COMMENT '密码哈希值',
    email VARCHAR(255) NOT NULL UNIQUE COMMENT '用户电子邮件地址',
    phone_number VARCHAR(20) COMMENT '用户联系电话',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '账户创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新账户信息的时间'
) COMMENT='用户信息表,存储用户的基本信息';
1
2
3
4
5
6
7
8
9

‌TIMESTAMP‌:适用于需要记录精确时间戳的场景,特别是需要记录数据创建或更新的具体时间的场合。TIMESTAMP还常用于自动记录数据变更的时间‌。

MySql中,常用2种时间数据格式,

  • TIMESTAMP‌:存储时将客户端的时间从当前时区转换为UTC进行存储,查询时再将UTC时间转换回客户端的当前时区进行显示。这意味着TIMESTAMP值会根据时区的变化而变化,而DATE则不会‌.

  • DATE‌:不涉及时区问题,始终以YYYY-MM-DD格式存储和显示。

CREATE TABLE Ticket (
    ticket_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '门票唯一标识符',
    ticket_type ENUM('adult', 'child', 'group', 'annual') NOT NULL COMMENT '门票类型(成人票、儿童票、团体票、年卡等)',
    price DECIMAL(10, 2) NOT NULL COMMENT '门票价格',
    description TEXT COMMENT '门票描述信息',
    valid_from DATE COMMENT '门票开始有效日期',
    valid_to DATE COMMENT '门票失效日期',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新记录的时间'
) COMMENT='门票信息表,存储所有可用门票的信息';
1
2
3
4
5
6
7
8
9
10

注意,门票的价格可能会改变,所以加上“最后一次更新时间”,当然,你还可以加上“最后一次更新操作人”字段。

CREATE TABLE `Order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单唯一标识符',
    user_id INT NOT NULL COMMENT '关联到用户的唯一标识符',
  
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '订单总金额',
    status ENUM('paid', 'unpaid', 'cancelled') NOT NULL DEFAULT 'unpaid' COMMENT '订单状态(已支付、未支付、已取消等)',
    payment_method VARCHAR(50) COMMENT '支付方式(如信用卡、支付宝等)',
    paid_at TIMESTAMP NULL COMMENT '支付时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单的时间',
    FOREIGN KEY (user_id) REFERENCES User(user_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单信息表,保存用户的购买订单详情';
1
2
3
4
5
6
7
8
9
10
11
12
13
14

但实际上,生活中,常常是一个人买多张表,因为买这个操作需要排队,允许一个人买多张,就能大大的提高效率。于是我们将order表改进下,


CREATE TABLE `Order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单唯一标识符',
    user_id INT NOT NULL COMMENT '关联到用户的唯一标识符',
 		ticket_id INT NOT NULL COMMENT '关联到门票的唯一标识符',
  	## 增加 门票
 	  quantity INT NOT NULL DEFAULT 1 COMMENT '此订单中该票的数量',
   	## 门票的数量
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '订单总金额',
    ## 加上购买时的价格 也就是所谓的快照
  	price_at_purchase DECIMAL(10, 2) NOT NULL COMMENT '购买时的价格(防止未来票价变动影响历史订单数据)',
  
    status ENUM('paid', 'unpaid', 'cancelled') NOT NULL DEFAULT 'unpaid' COMMENT '订单状态(已支付、未支付、已取消等)',
    payment_method VARCHAR(50) COMMENT '支付方式(如信用卡、支付宝等)',
    paid_at TIMESTAMP NULL COMMENT '支付时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单的时间',
    FOREIGN KEY (user_id) REFERENCES User(user_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单信息表,保存用户的购买订单详情';

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 功能增加-订单包含多个产品

需求背景,景区中可以有多个景点,每个景点,可以是不同公司在管理,也可以是同一个公司在管理,在数据库中要体现这种关系,则需要增加一个实体——景点。

CREATE TABLE Attraction (
    attraction_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '景点唯一标识符',
    name VARCHAR(255) NOT NULL COMMENT '景点名称',
    location VARCHAR(255) COMMENT '景点位置',
    description TEXT COMMENT '景点描述信息',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新记录的时间'
) COMMENT='景点信息表,存储各个景点的信息';
1
2
3
4
5
6
7
8

订单表需要进行一些修改,以支持一个订单可以包含多个景点的产品。

问题来了,如果我们按照之前的方式,通过attraction_id来进行关联,那订单在设计上,势必会出现所谓的“宽表”,因为需求中说了,订单中可以包含多个景点,

可能存在的问题有以下几个:

  1. 数据冗余:如果尝试直接在 Order 表中存储与多个景点和门票的关系,你可能需要为每个关系创建单独的列(例如 attraction_id_1, attraction_id_2, ...),这会导致大量的重复字段。
  2. 扩展性差:当你需要支持更多景点或不同类型的门票时,这种设计将非常难以扩展。
  3. 查询复杂度增加:对于复杂的查询(如查找某个景点的所有订单),会变得更加复杂和低效。

你可能会说,那用json字段不就行了吗?json字段确实可以实现,动态扩展,但查询效率就会降低。

所以,为了解决上述问题,我们把订单-用户-景点,三者的关系抽离出来,弄成一张关系表。而订单中则只保留核心字段。

# 修改后表

以下是订单表

CREATE TABLE `Order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单唯一标识符',
    user_id INT NOT NULL COMMENT '关联到用户的唯一标识符',
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '订单总金额',
    status ENUM('paid', 'unpaid', 'cancelled') NOT NULL DEFAULT 'unpaid' COMMENT '订单状态(已支付、未支付、已取消等)',
    payment_method VARCHAR(50) COMMENT '支付方式(如信用卡、支付宝等)',
    paid_at TIMESTAMP NULL COMMENT '支付时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单的时间',
    FOREIGN KEY (user_id) REFERENCES User(user_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单信息表,保存用户的购买订单详情';
1
2
3
4
5
6
7
8
9
10
11
12
13

景点和订单的关系,以及订单和用户的关系放到一张——关系表中,或者叫订单项表中,Order_Item。

CREATE TABLE Order_Item (
    order_item_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '关系记录唯一标识符',
    order_id INT NOT NULL COMMENT '关联到订单的唯一标识符',
    ticket_id INT NOT NULL COMMENT '关联到门票的唯一标识符',
    attraction_id INT NOT NULL COMMENT '关联到景点的唯一标识符',
    quantity INT NOT NULL DEFAULT 1 COMMENT '此订单中该票的数量',
    price_at_purchase DECIMAL(10, 2) NOT NULL COMMENT '购买时的价格(防止未来票价变动影响历史订单数据)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '关系记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新关系记录的时间',
    FOREIGN KEY (order_id) REFERENCES `Order`(order_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (ticket_id) REFERENCES Ticket(ticket_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    FOREIGN KEY (attraction_id) REFERENCES Attraction(attraction_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单和票的关系表,用于关联订单与具体的门票及对应的景点';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

如此一来,如果订单要关联多个景点,后续扩展时,只用在该表上加数据即可。

# 功能增加-支持部分退

现在要支持,退票了,通常的退票是退整张票,但现在加上了景点,需要支持只退部分景点。

主要的设计思路是增加一个退票记录表(Refund_Record),用于记录每个订单的退票详情。此外,还需要在 Order_Item 表中添加字段来跟踪每项产品的状态(例如已退款、未退款等)。以下是详细的数据库设计方案:

# 订单表修改

在 Order 表中添加字段以记录订单的状态和退款状态。

CREATE TABLE `Order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单唯一标识符',
    user_id INT NOT NULL COMMENT '关联到用户的唯一标识符',
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '订单总金额',
  ## 部分退 全部退
    status ENUM('paid', 'unpaid', 'cancelled', 'partially_refunded', 'fully_refunded') NOT NULL DEFAULT 'unpaid' COMMENT '订单状态(已支付、未支付、已取消、部分退款、全额退款等)',
    payment_method VARCHAR(50) COMMENT '支付方式(如信用卡、支付宝等)',
    paid_at TIMESTAMP NULL COMMENT '支付时间',
    refunded_at TIMESTAMP NULL COMMENT '退款时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单的时间',
    FOREIGN KEY (user_id) REFERENCES User(user_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单信息表,保存用户的购买订单详情';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 订单项表修改

在 Order_Item 表中添加字段以记录每个订单项的状态(如已退款、未退款等)。

同时,对于退款也要加上一个限制条件,就是为进行消费的景点,也就是未参观的景点才支持退款。所以对于订单项表中的订单项一共需要加2个状态字段——已退款,已消费。

CREATE TABLE Order_Item (
    order_item_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单项唯一标识符',
    order_id INT NOT NULL COMMENT '关联到订单的唯一标识符',
    ticket_id INT NOT NULL COMMENT '关联到门票的唯一标识符',
    attraction_id INT NOT NULL COMMENT '关联到景点的唯一标识符',
    quantity INT NOT NULL DEFAULT 1 COMMENT '此订单中该票的数量',
    price_at_purchase DECIMAL(10, 2) NOT NULL COMMENT '购买时的价格(防止未来票价变动影响历史订单数据)',
  ## 订单项 是否退款 ,已购买 表示 ()
    status ENUM('purchased', 'refunded','used') NOT NULL DEFAULT 'purchased' COMMENT '订单项状态(已购买、已退款、已消费)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单项创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单项的时间',
    FOREIGN KEY (order_id) REFERENCES `Order`(order_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (ticket_id) REFERENCES Ticket(ticket_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    FOREIGN KEY (attraction_id) REFERENCES Attraction(attraction_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单项表,用于关联订单中的每个产品及其对应的门票和景点';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 增加-退款记录表

当然对于退款,我们需要更详细的信息,所以我们还需要一个退款记录表。

CREATE TABLE Refund_Record (
    refund_record_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '退票记录唯一标识符',
    order_id INT NOT NULL COMMENT '关联到订单的唯一标识符',
    order_item_id INT NOT NULL COMMENT '关联到订单项的唯一标识符',
    refunded_amount DECIMAL(10, 2) NOT NULL COMMENT '退款金额',
    refund_reason TEXT COMMENT '退款原因',
    refunded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '退款时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '退票记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新退票记录的时间',
    FOREIGN KEY (order_id) REFERENCES `Order`(order_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (order_item_id) REFERENCES Order_Item(order_item_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) COMMENT='退票记录表,用于记录每次退票的详细信息';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 已使用字段的设计

之前在,Order_Item中status增加了一个——已使用,来实现限制退票,其实关于“已使用”,还可以增加一个字段来实现,比如is_used,所以你会选择哪种呢?

CREATE TABLE Order_Item (
    order_item_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单项唯一标识符',
    order_id INT NOT NULL COMMENT '关联到订单的唯一标识符',
    ticket_id INT NOT NULL COMMENT '关联到门票的唯一标识符',
    attraction_id INT NOT NULL COMMENT '关联到景点的唯一标识符',
    quantity INT NOT NULL DEFAULT 1 COMMENT '此订单中该票的数量',
    price_at_purchase DECIMAL(10, 2) NOT NULL COMMENT '购买时的价格',
    status ENUM('purchased', 'refunded') NOT NULL DEFAULT 'purchased' COMMENT '订单项状态(已购买、已退款)',
  ## 增加使用情况 字段
    is_used TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已使用(0: 未使用, 1: 已使用)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单项创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单项的时间'
);
1
2
3
4
5
6
7
8
9
10
11
12
13

以下是增加字段的优势,它的缺点就是增加了表的复杂性。

  1. 职责分离:
    • status 字段专注于订单项的状态(如是否已退款)。
    • is_used 字段专注于门票的使用情况(如是否已消费)。
    • 职责清晰,便于维护和理解。
  2. 灵活性高:
    • 可以支持更复杂的场景,例如门票被部分使用(如多次入园的情况)。
  3. 扩展性强:
    • 如果未来需要增加更多与使用相关的逻辑(如有效期管理),可以直接基于 is_used 扩展,而不会影响 status 的逻辑。
  4. 查询效率高:
    • 单独的字段可以更容易地进行索引优化,提升查询性能。

而直接在status中增加属性,它有以下优势:

  • 不需要新增字段,所有逻辑都集中在一个字段中。
  • 对于简单的业务场景,这种设计更加直观。

但他,有一个致命问题,它的职责划分不明确,status 字段同时承担了“订单项状态”和“门票使用情况”的双重职责。且随着业务的发展,问题可能会变更复杂,如果未来需要支持更复杂的使用场景(如部分使用、多次入园等),status 字段可能变得难以维护。

所以综上所述,对于部分退款,是否使用,使用增加一个字段的方式来表示更好。

# 总结

为了实现以上功能,共设计了以下几个表:

# 用户表

CREATE TABLE User (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户唯一标识符',
    username VARCHAR(255) NOT NULL UNIQUE COMMENT '用户名或登录名',
    password_hash VARCHAR(255) COMMENT '密码哈希值',
    email VARCHAR(255) NOT NULL UNIQUE COMMENT '用户电子邮件地址',
    phone_number VARCHAR(20) COMMENT '用户联系电话',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '账户创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新账户信息的时间'
) COMMENT='用户信息表,存储用户的基本信息';
1
2
3
4
5
6
7
8
9

# 门票表

CREATE TABLE Ticket (
    ticket_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '门票唯一标识符',
    ticket_type ENUM('adult', 'child', 'group', 'annual') NOT NULL COMMENT '门票类型(成人票、儿童票、团体票、年卡等)',
    price DECIMAL(10, 2) NOT NULL COMMENT '门票价格',
    description TEXT COMMENT '门票描述信息',
    valid_from DATE COMMENT '门票开始有效日期',
    valid_to DATE COMMENT '门票失效日期',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新记录的时间',
  	updated_user_id INT comment '最后一次修改人id' 
) COMMENT='门票信息表,存储所有可用门票的信息';
1
2
3
4
5
6
7
8
9
10
11

# 景点表

CREATE TABLE Attraction (
  	company_id int not null comment '所属公司id',
    attraction_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '景点唯一标识符',
    name VARCHAR(255) NOT NULL COMMENT '景点名称',
    location VARCHAR(255) COMMENT '景点位置',
    description TEXT COMMENT '景点描述信息',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新记录的时间'
) COMMENT='景点信息表,存储各个景点的信息';
1
2
3
4
5
6
7
8
9

# 订单表

CREATE TABLE `Order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单唯一标识符',
    user_id INT NOT NULL COMMENT '关联到用户的唯一标识符',
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '订单总金额',
  ## 部分退 全部退
    status ENUM('paid', 'unpaid', 'cancelled', 'partially_refunded', 'fully_refunded') NOT NULL DEFAULT 'unpaid' COMMENT '订单状态(已支付、未支付、已取消、部分退款、全额退款等)',
    payment_method VARCHAR(50) COMMENT '支付方式(如信用卡、支付宝等)',
    paid_at TIMESTAMP NULL COMMENT '支付时间',
    refunded_at TIMESTAMP NULL COMMENT '退款时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单的时间',
    FOREIGN KEY (user_id) REFERENCES User(user_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) COMMENT='订单信息表,保存用户的购买订单详情';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 订单项信息表

CREATE TABLE Order_Item (
    order_item_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单项唯一标识符',
    order_id INT NOT NULL COMMENT '关联到订单的唯一标识符',
    ticket_id INT NOT NULL COMMENT '关联到门票的唯一标识符',
    attraction_id INT NOT NULL COMMENT '关联到景点的唯一标识符',
    quantity INT NOT NULL DEFAULT 1 COMMENT '此订单中该票的数量',
    price_at_purchase DECIMAL(10, 2) NOT NULL COMMENT '购买时的价格',
    status ENUM('purchased', 'refunded') NOT NULL DEFAULT 'purchased' COMMENT '订单项状态(已购买、已退款)',
  ## 增加使用情况 字段
    is_used TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已使用(0: 未使用, 1: 已使用)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '订单项创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新订单项的时间'
);
1
2
3
4
5
6
7
8
9
10
11
12
13

# 退款信息表

CREATE TABLE Refund_Record (
    refund_record_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '退票记录唯一标识符',
    order_id INT NOT NULL COMMENT '关联到订单的唯一标识符',
    order_item_id INT NOT NULL COMMENT '关联到订单项的唯一标识符',
    refunded_amount DECIMAL(10, 2) NOT NULL COMMENT '退款金额',
    refund_reason TEXT COMMENT '退款原因',
    refunded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '退款时间',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '退票记录创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新退票记录的时间',
    FOREIGN KEY (order_id) REFERENCES `Order`(order_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (order_item_id) REFERENCES Order_Item(order_item_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) COMMENT='退票记录表,用于记录每次退票的详细信息';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 功能增加-用户vip-优惠

待实现

# 代码接口设计

上次更新: 2025/04/23, 16:23:16
HTTP调用:你考虑到超时、重试、并发了吗

← HTTP调用:你考虑到超时、重试、并发了吗

最近更新
01
面向切面跟自定义注解的结合
05-22
02
时间跟其他数据的序列化
05-19
03
数据加密与安全
05-17
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式