前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数据库基础练习系列45、优惠券发放系统

MySQL数据库基础练习系列45、优惠券发放系统

作者头像
红目香薰
发布2024-06-16 12:31:32
870
发布2024-06-16 12:31:32
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode

MySQL数据库基础练习系列目标

很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。

数据库环境

MySQL版本:5.7.31-log

数据库字符集,所有数据库通用字符集与排序规则,支持中文数据。

字符集:utf8 排序规则:utf8_general_ci

使用工具:Navicat Premium 15,可以在下面的连接中下载

https://download.csdn.net/download/feng8403000/89403778

项目名称与项目简介

优惠券发放系统是一个用于管理优惠券的发放、领取和使用的系统。该系统主要面向商家和用户,商家可以创建和发放优惠券,而用户可以领取并使用这些优惠券进行消费。主要功能包括优惠券的创建、发放、领取、使用记录查询以及用户信息的维护等。

数据库DDL(注意创建顺序)

为了直接运行DDL语句并创建表,我们需要确保在创建含有外键约束的表之前,相关的被引用表(即外键指向的表)已经存在。所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。

代码语言:javascript
复制
-- 用户表
CREATE TABLE Users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(255) NOT NULL,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100),
    gender ENUM('男', '女') NOT NULL,
    phone VARCHAR(20)
);


-- 优惠券类型表
CREATE TABLE CouponTypes (
    coupon_type_id INT AUTO_INCREMENT PRIMARY KEY,
    type_name VARCHAR(50) NOT NULL,
    discount_rate DECIMAL(4, 2) NOT NULL,  -- 折扣率
    max_usage_per_user INT DEFAULT NULL    -- 每个用户最大使用次数
);


-- 优惠券表
CREATE TABLE Coupons (
    coupon_id INT AUTO_INCREMENT PRIMARY KEY,
    coupon_type_id INT NOT NULL,
    code VARCHAR(50) NOT NULL UNIQUE,      -- 优惠券码
    start_date DATE NOT NULL,             -- 开始日期
    end_date DATE NOT NULL,               -- 结束日期
    usage_count INT DEFAULT 0,             -- 已使用次数
    status ENUM('active', 'expired', 'used_up') NOT NULL DEFAULT 'active',  -- 优惠券状态
    FOREIGN KEY (coupon_type_id) REFERENCES CouponTypes(coupon_type_id)
);


-- 用户领取优惠券记录表
CREATE TABLE UserCoupons (
    record_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    coupon_id INT NOT NULL,
    receive_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 领取时间
    is_used ENUM('no', 'yes') NOT NULL DEFAULT 'no',  -- 是否已使用
    FOREIGN KEY (user_id) REFERENCES Users(user_id),
    FOREIGN KEY (coupon_id) REFERENCES Coupons(coupon_id)
);


-- 优惠券使用记录表(可选,用于记录每次使用的详情)
CREATE TABLE CouponUsageLogs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    record_id INT NOT NULL,
    usage_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 使用时间
    order_id VARCHAR(50),                           -- 订单号(可选)
    amount DECIMAL(10, 2),                          -- 使用金额
    FOREIGN KEY (record_id) REFERENCES UserCoupons(record_id)
);

插入数据DML(注意插入数据顺序)

插入数据的时候也要注意主外键关系,如果没有外检的情况下是没有办法插入从表数据的。

代码语言:javascript
复制
INSERT INTO Users (username, password, name, email, gender, phone) VALUES
('乔峰', '123', '乔峰', 'qiaofeng@email.com', '男', '13800138001'),
('小龙女', '123', '小龙女', 'xiaolongnu@email.com', '女', '13900139002'),
('令狐冲', '123', '令狐冲', 'linghuchong@email.com', '男', '13700137003');
INSERT INTO CouponTypes (type_name, discount_rate, max_usage_per_user) VALUES
('满100减20', 20.00, 3),
('全场9折', 10.00, 5),
('新用户专享', 50.00, 1);
INSERT INTO Coupons (coupon_type_id, code, start_date, end_date, status) VALUES
(1, 'CT10020-A', '2023-01-01', '2023-12-31', 'active'),
(1, 'CT10020-B', '2023-01-01', '2023-12-31', 'active'),
(2, 'CT90-A', '2023-01-01', '2023-12-31', 'active');
INSERT INTO UserCoupons (user_id, coupon_id) VALUES
(1, 1), -- 乔峰领取了满100减20优惠券A
(2, 2), -- 小龙女领取了全场9折优惠券A
(3, 1), -- 令狐冲也领取了满100减20优惠券A
(1, 3); -- 乔峰再领取了新用户专享优惠券
INSERT INTO CouponUsageLogs (record_id, order_id, amount) VALUES
(1, 'ORDER123', 80.00), -- 乔峰使用了领取的满100减20优惠券A,订单金额为80元
(3, 'ORDER456', 150.00); -- 令狐冲使用了领取的满100减20优惠券A,订单金额为150元

遵循的数据库三范式

数据库建表的三范式(3NF,Third Normal Form)是关系型数据库设计的基本原则,用于确保数据库结构的逻辑性和减少数据冗余。这三个范式是逐步细化的,每一个范式都是在前一个范式的基础上建立的。下面我将详细解释这三个范式:

第一范式(1NF, First Normal Form)

定义

  1. 列不可分割,即数据库表的每一列都是不可分割的原子数据项。
  2. 每一列都是不可再分的最小数据单元(也称为最小的原子单元)。

解释

  • 在第一范式中,主要关注的是列的原子性。也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。
  • 例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”和“国家”。

第二范式(2NF, Second Normal Form)

定义

  1. 满足1NF。
  2. 非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。

解释

  • 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。
  • 在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
  • 如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。

第三范式(3NF, Third Normal Form)

定义

  1. 满足2NF。
  2. 非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。

解释

  • 第三范式是在第二范式的基础上进一步细化的。它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。
  • 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL数据库基础练习系列目标
  • 数据库环境
  • 项目名称与项目简介
  • 数据库DDL(注意创建顺序)
  • 插入数据DML(注意插入数据顺序)
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档