MySQL表设计实战创建一个优惠券表和使用记录表
更新时间:2023-12-25
## 创建优惠券表
我们开始创建一个优惠券表,这个表用于存储所有优惠券的信息。设计表时需要考虑优惠券的基本信息,例如编号、名称、有效期和面额等。以下是表的从头部中定义的代码示例:
CREATE TABLE `coupons` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL COMMENT '优惠券名字', `code` varchar(50) NOT NULL COMMENT '优惠码', `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '优惠券类型:1满减优惠;2折扣优惠', `min_amount` decimal(10,2) DEFAULT NULL COMMENT '最低使用条件, 满多少元可用', `discount` decimal(5,2) DEFAULT NULL COMMENT '折扣, 0.00 ~ 1.00', `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠额度,数值或百分比', `total` int(11) NOT NULL DEFAULT '0' COMMENT '发放总量', `stock` int(11) NOT NULL DEFAULT '0' COMMENT '剩余库存', `limit_type` tinyint(4) DEFAULT '0' COMMENT '使用限制类型:0不限制,1用户限制,2订单限制,3限时限量,4限时限购', `limit_amount` int(11) DEFAULT NULL COMMENT '使用限制数量,0为不限', `start_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '截止时间', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', `deleted_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='优惠券表';解释: - `id` 是优惠券的唯一标识符。每个优惠券都必须有一个唯一的编号。 - `name` 是优惠券的名称,用于识别优惠券的类型。 - `code` 是优惠券的唯一编码,用户在使用优惠券时需要使用这个编码。 - `type` 是优惠券的类型。1 表示满减优惠,2 表示折扣优惠。 - `min_amount` 是最低使用条件,满足这个条件才可以使用优惠券。 - `discount` 是折扣比例,在折扣优惠中使用。 - `amount` 是优惠额度,在满减优惠中使用。 - `total` 是发放总量,在优惠券创建时就需要指定。 - `stock` 是优惠券的剩余库存,每个优惠券都有一定的库存数量。 - `limit_type` 是使用限制类型,表示优惠券的使用类型。 - `limit_amount` 是使用限制的数量,0 表示不限制。 - `start_time` 和 `end_time` 是优惠券的有效期,只在有效期内才可以使用。 ## 创建优惠券使用记录表 现在我们需要创建一个表来记录优惠券的使用情况。这个表和优惠券表存在关联,通过优惠券的编号来关联两个表。以下是表的从头部中定义的代码示例:
CREATE TABLE `coupon_history` ( `id` int(11) NOT NULL AUTO_INCREMENT, `coupon_id` int(11) NOT NULL COMMENT '优惠券ID', `order_id` int(11) NOT NULL COMMENT '订单ID', `user_id` int(11) NOT NULL COMMENT '用户ID', `used_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '使用时间', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='优惠券使用记录';解释: - `id` 是使用记录的唯一标识符。 - `coupon_id` 是优惠券的唯一标识符,与优惠券表中的 `id` 字段相对应。 - `order_id` 是订单的唯一标识符,与订单表中的 `id` 字段相对应。 - `user_id` 是用户的唯一标识符。 - `used_at` 是使用时间,使用优惠券时会记录下来。 - `created_at` 是创建时间,使用记录创建时就会记录下来。 ## PHP代码示例 下面是PHP代码示例,我们使用面向对象的方式操作 MySQL:
插入一条优惠券数据
// 创建一个优惠券对象 class Coupon { public $name; public $code; public $type; public $minAmount; public $discount; public $amount; public $total; public $stock; public $limitType; public $limitAmount; public $startTime; public $endTime; public function __construct( $name, $code, $type, $minAmount, $discount, $amount, $total, $stock, $limitType, $limitAmount, $startTime, $endTime ) { $this->name = $name; $this->code = $code; $this->type = $type; $this->minAmount = $minAmount; $this->discount = $discount; $this->amount = $amount; $this->total = $total; $this->stock = $stock; $this->limitType = $limitType; $this->limitAmount = $limitAmount; $this->startTime = $startTime; $this->endTime = $endTime; } public function save() { $mysqli = new mysqli("localhost", "user", "password", "database"); $sql = "INSERT INTO `coupon` ( `name`, `code`, `type`, `min_amount`, `discount`, `amount`, `total`, `stock`, `limit_type`, `limit_amount`, `start_time`, `end_time` ) VALUES ( '{$this->name}', '{$this->code}', {$this->type}, {$this->minAmount}, {$this->discount}, {$this->amount}, {$this->total}, {$this->stock}, {$this->limitType}, {$this->limitAmount}, '{$this->startTime}', '{$this->endTime}' )"; $result = $mysqli->query($sql); if (!$result) { trigger_error($mysqli->error); } } } // 插入一条数据 $coupon = new Coupon( "打折券", "123456", 2, 0, 0.75, 0, 100, 100, 1, 1, "2021-05-01 00:00:00", "2022-05-01 00:00:00" ); $coupon->save();
插入一条使用记录数据
$mysqli = new mysqli("localhost", "user", "password", "database"); $orderId = 1001; $couponId = 1; $userId = 1000; $sql = "INSERT INTO `coupon_history` ( `coupon_id`, `order_id`, `user_id` ) VALUES ( {$couponId}, {$orderId}, {$userId} )"; $result = $mysqli->query($sql); if (!$result) { trigger_error($mysqli->error); }
查找指定优惠券的使用记录
$mysqli = new mysqli("localhost", "user", "password", "database"); $couponId = 1; $sql = "SELECT `coupon_id`, `order_id`, `user_id`, `used_at` FROM `coupon_history` WHERE `coupon_id` = {$couponId}"; $result = $mysqli->query($sql); if ($result) { while ($row = $result->fetch_assoc()) { print_r($row); } } else { trigger_error($mysqli->error); }## 总结 创建优惠券表和使用记录表是电商开发中的常见需求。在设计表结构时需要考虑优惠券的基本信息,例如优惠券的名称、类型、有效期、面额等。使用记录表中需要保存优惠券的编号、订单号、使用时间等信息,并且需要和优惠券表关联。在 PHP 代码中,我们可以使用面向对象的方式来操作 MySQL 数据库,将实体对象和数据库操作进行解耦。