景区门票管理和核销-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='用户信息表,存储用户的基本信息';
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='门票信息表,存储所有可用门票的信息';
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='订单信息表,保存用户的购买订单详情';
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='订单信息表,保存用户的购买订单详情';
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='景点信息表,存储各个景点的信息';
2
3
4
5
6
7
8
订单表需要进行一些修改,以支持一个订单可以包含多个景点的产品。
问题来了,如果我们按照之前的方式,通过attraction_id
来进行关联,那订单在设计上,势必会出现所谓的“宽表”,因为需求中说了,订单中可以包含多个景点,
可能存在的问题有以下几个:
- 数据冗余:如果尝试直接在
Order
表中存储与多个景点和门票的关系,你可能需要为每个关系创建单独的列(例如attraction_id_1
,attraction_id_2
, ...),这会导致大量的重复字段。 - 扩展性差:当你需要支持更多景点或不同类型的门票时,这种设计将非常难以扩展。
- 查询复杂度增加:对于复杂的查询(如查找某个景点的所有订单),会变得更加复杂和低效。
你可能会说,那用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='订单信息表,保存用户的购买订单详情';
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='订单和票的关系表,用于关联订单与具体的门票及对应的景点';
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='订单信息表,保存用户的购买订单详情';
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='订单项表,用于关联订单中的每个产品及其对应的门票和景点';
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='退票记录表,用于记录每次退票的详细信息';
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 '最后一次更新订单项的时间'
);
2
3
4
5
6
7
8
9
10
11
12
13
以下是增加字段
的优势,它的缺点就是增加了表的复杂性。
- 职责分离:
status
字段专注于订单项的状态(如是否已退款)。is_used
字段专注于门票的使用情况(如是否已消费)。- 职责清晰,便于维护和理解。
- 灵活性高:
- 可以支持更复杂的场景,例如门票被部分使用(如多次入园的情况)。
- 扩展性强:
- 如果未来需要增加更多与使用相关的逻辑(如有效期管理),可以直接基于
is_used
扩展,而不会影响status
的逻辑。
- 如果未来需要增加更多与使用相关的逻辑(如有效期管理),可以直接基于
- 查询效率高:
- 单独的字段可以更容易地进行索引优化,提升查询性能。
而直接在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='用户信息表,存储用户的基本信息';
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='门票信息表,存储所有可用门票的信息';
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='景点信息表,存储各个景点的信息';
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='订单信息表,保存用户的购买订单详情';
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 '最后一次更新订单项的时间'
);
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='退票记录表,用于记录每次退票的详细信息';
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 功能增加-用户vip-优惠
待实现