在商城系统中,广告位表需要支撑首页轮播、分类页横幅、商品详情页推荐等多种广告场景,设计时要兼顾业务灵活性和数据存储的高效性,核心要覆盖广告的基础属性、投放规则、状态管理和数据统计能力。

核心字段规划
广告位表的核心字段需要包含广告的身份标识、基础信息、投放规则、状态控制、时间信息和数据统计维度,具体字段说明如下:
| 字段名 | 类型 | 说明 | 是否必填 |
|---|---|---|---|
| id | bigint unsigned | 广告唯一标识,主键自增 | 是 |
| ad_name | varchar(100) | 广告名称,用于后台管理识别 | 是 |
| ad_position | varchar(50) | 广告位标识,如home_banner、category_top | 是 |
| ad_type | tinyint | 广告类型,1图片、2视频、3文字链 | 是 |
| ad_content | text | 广告内容,图片存URL、视频存地址、文字存内容 | 是 |
| link_url | varchar(255) | 广告点击跳转地址 | 否 |
| start_time | datetime | 广告投放开始时间 | 是 |
| end_time | datetime | 广告投放结束时间 | 是 |
| sort_order | int | 同广告位内的排序权重,值越大越靠前 | 是 |
| status | tinyint | 状态,0禁用、1启用、2待审核 | 是 |
| pv_count | int unsigned | 累计曝光量 | 否 |
| click_count | int unsigned | 累计点击量 | 否 |
| create_time | datetime | 记录创建时间 | 是 |
| update_time | datetime | 记录更新时间 | 是 |
完整建表语句
以下是符合上述字段规划的MySQL建表语句,包含必要的索引和注释:
-- 商城广告位表 CREATE TABLE `mall_ad` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '广告唯一ID', `ad_name` varchar(100) NOT NULL COMMENT '广告名称', `ad_position` varchar(50) NOT NULL COMMENT '广告位标识', `ad_type` tinyint NOT NULL COMMENT '广告类型 1图片 2视频 3文字链', `ad_content` text NOT NULL COMMENT '广告内容', `link_url` varchar(255) DEFAULT NULL COMMENT '跳转地址', `start_time` datetime NOT NULL COMMENT '投放开始时间', `end_time` datetime NOT NULL COMMENT '投放结束时间', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序权重', `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态 0禁用 1启用 2待审核', `pv_count` int unsigned NOT NULL DEFAULT '0' COMMENT '累计曝光量', `click_count` int unsigned NOT NULL DEFAULT '0' COMMENT '累计点击量', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_ad_position_status` (`ad_position`,`status`), KEY `idx_start_end_time` (`start_time`,`end_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商城广告位表';
设计要点说明
索引设计
索引设计要贴合常见查询场景,商城广告查询通常按广告位和状态筛选,同时会过滤投放时间范围,因此创建了两个联合索引:
idx_ad_position_status:用于查询指定广告位下的启用/禁用广告,是最高频的查询场景idx_start_end_time:用于筛选投放时间范围内的广告,避免全表扫描
扩展设计建议
如果业务有更复杂的投放需求,可以在基础表结构上做扩展:
- 增加
target_user_group字段,存储定向投放的用户群体标识,实现精准投放 - 增加
max_show_count字段,设置广告最大曝光次数,达到阈值后自动下线 - 如果广告位类型非常多,可以单独创建广告位配置表,存储不同广告位的尺寸、展示规则等信息,和广告表做关联
数据更新注意事项
曝光量和点击量是高频更新的字段,建议不要直接频繁更新原表,可以先将统计数据存入Redis等缓存,定期汇总后批量更新到数据库,减少数据库写入压力。
常见查询示例
以下是商城前端获取首页轮播广告的常见查询语句:
-- 查询首页轮播位启用的、在投放时间内的广告,按排序权重降序 SELECT id, ad_name, ad_type, ad_content, link_url FROM mall_ad WHERE ad_position = 'home_banner' AND status = 1 AND start_time <= NOW() AND end_time >= NOW() ORDER BY sort_order DESC;