用户标签体系管理是精细化运营的基础,通过给用户打上不同维度的标签,可以精准筛选目标用户群体进行推送,提升运营效率。php作为常用的后端开发语言,能够完整实现从标签管理到动态打标再到精准推送的全流程功能。
一、数据库表设计
首先需要设计合理的数据库表结构,支撑标签管理和用户打标的需求,核心需要三张表:
- 标签表:存储所有标签的基础信息
- 用户标签关联表:记录用户和标签的绑定关系
- 用户行为日志表:存储用户的行为数据,用于触发动态打标
下面是具体的表结构SQL:
-- 标签表 CREATE TABLE `tag` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tag_name` varchar(50) NOT NULL COMMENT '标签名称', `tag_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '标签类型 1手动标签 2动态标签', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_tag_name` (`tag_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户标签表'; -- 用户标签关联表 CREATE TABLE `user_tag_rel` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `tag_id` int(11) NOT NULL COMMENT '标签ID', `bind_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_user_tag` (`user_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户标签关联表'; -- 用户行为日志表 CREATE TABLE `user_action_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `action_type` varchar(30) NOT NULL COMMENT '行为类型 如view_article、buy_goods', `action_value` varchar(100) DEFAULT NULL COMMENT '行为附加参数', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_action` (`user_id`,`action_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户行为日志表';
二、标签体系管理功能实现
1. 标签的增删改查
首先需要实现标签的基础管理功能,方便运营人员维护标签库,下面是php实现的标签添加示例:
<?php
/**
* 添加新标签
* @param string $tagName 标签名称
* @param int $tagType 标签类型 1手动 2动态
* @param PDO $pdo 数据库连接对象
* @return array 操作结果
*/
function addTag($tagName, $tagType, $pdo) {
// 校验参数
if (empty($tagName) || !in_array($tagType, [1,2])) {
return ['code' => 400, 'msg' => '参数错误'];
}
try {
$sql = "INSERT INTO tag (tag_name, tag_type) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$res = $stmt->execute([$tagName, $tagType]);
if ($res) {
return ['code' => 200, 'msg' => '添加成功', 'data' => $pdo->lastInsertId()];
}
return ['code' => 500, 'msg' => '添加失败'];
} catch (PDOException $e) {
// 唯一键冲突说明标签已存在
if ($e->getCode() == 23000) {
return ['code' => 400, 'msg' => '标签已存在'];
}
return ['code' => 500, 'msg' => '数据库错误'];
}
}
2. 手动给用户打标
运营人员可以手动给用户绑定标签,实现如下:
<?php
/**
* 手动给用户绑定标签
* @param int $userId 用户ID
* @param int $tagId 标签ID
* @param PDO $pdo 数据库连接对象
* @return array 操作结果
*/
function bindTagToUser($userId, $tagId, $pdo) {
if (empty($userId) || empty($tagId)) {
return ['code' => 400, 'msg' => '参数错误'];
}
try {
$sql = "INSERT IGNORE INTO user_tag_rel (user_id, tag_id) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId, $tagId]);
return ['code' => 200, 'msg' => '绑定成功'];
} catch (PDOException $e) {
return ['code' => 500, 'msg' => '数据库错误'];
}
}
三、动态打标逻辑实现
动态打标是指根据用户的行为自动给用户绑定对应标签,不需要人工干预。首先需要定义行为到标签的映射规则,比如用户浏览3次以上科技类文章,就打上科技爱好者标签。
可以在用户行为上报的接口中触发打标逻辑:
<?php
/**
* 用户行为上报并触发动态打标
* @param int $userId 用户ID
* @param string $actionType 行为类型
* @param string $actionValue 行为参数
* @param PDO $pdo 数据库连接对象
* @return void
*/
function reportUserAction($userId, $actionType, $actionValue, $pdo) {
// 1. 记录行为日志
$logSql = "INSERT INTO user_action_log (user_id, action_type, action_value) VALUES (?, ?, ?)";
$logStmt = $pdo->prepare($logSql);
$logStmt->execute([$userId, $actionType, $actionValue]);
// 2. 根据行为触发动态打标
$tagMap = [
'view_tech_article' => [ // 浏览科技文章行为
'condition' => function($userId, $pdo) {
// 统计最近30天浏览科技文章次数
$sql = "SELECT COUNT(*) as cnt FROM user_action_log
WHERE user_id = ? AND action_type = 'view_tech_article'
AND create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row['cnt'] >= 3; // 浏览3次以上触发打标
},
'tag_name' => '科技爱好者',
'tag_type' => 2
]
];
if (isset($tagMap[$actionType])) {
$rule = $tagMap[$actionType];
// 判断是否满足打标条件
if ($rule['condition']($userId, $pdo)) {
// 先获取或创建标签
$tagSql = "SELECT id FROM tag WHERE tag_name = ? AND tag_type = ?";
$tagStmt = $pdo->prepare($tagSql);
$tagStmt->execute([$rule['tag_name'], $rule['tag_type']]);
$tagRow = $tagStmt->fetch(PDO::FETCH_ASSOC);
if ($tagRow) {
$tagId = $tagRow['id'];
} else {
// 标签不存在则创建
$addSql = "INSERT INTO tag (tag_name, tag_type) VALUES (?, ?)";
$addStmt = $pdo->prepare($addSql);
$addStmt->execute([$rule['tag_name'], $rule['tag_type']]);
$tagId = $pdo->lastInsertId();
}
// 绑定标签到用户
bindTagToUser($userId, $tagId, $pdo);
}
}
}
四、基于标签的精准推送实现
精准推送的核心是筛选出符合目标标签的用户,然后调用推送接口发送消息。下面是一个根据标签筛选用户并推送的示例:
<?php
/**
* 根据标签筛选用户并推送消息
* @param array $tagIds 目标标签ID数组
* @param string $pushContent 推送内容
* @param PDO $pdo 数据库连接对象
* @return array 推送结果
*/
function pushByTags($tagIds, $pushContent, $pdo) {
if (empty($tagIds) || empty($pushContent)) {
return ['code' => 400, 'msg' => '参数错误'];
}
// 1. 根据标签筛选用户ID,去重
$placeholders = implode(',', array_fill(0, count($tagIds), '?'));
$sql = "SELECT DISTINCT user_id FROM user_tag_rel WHERE tag_id IN ({$placeholders})";
$stmt = $pdo->prepare($sql);
$stmt->execute($tagIds);
$userList = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($userList)) {
return ['code' => 200, 'msg' => '未找到符合条件的用户'];
}
$successCount = 0;
// 2. 遍历用户调用推送接口(这里模拟推送逻辑)
foreach ($userList as $user) {
$userId = $user['user_id'];
// 实际项目中这里调用第三方推送SDK或者自研推送接口
// 这里模拟推送成功
$pushRes = true; // 假设推送成功
if ($pushRes) {
$successCount++;
}
}
return ['code' => 200, 'msg' => '推送完成', 'data' => ['total' => count($userList), 'success' => $successCount]];
}
五、注意事项
- 用户标签关联表建议增加过期时间字段,对于动态标签可以设置自动过期,避免标签长期不准确
- 动态打标的规则建议做成可配置的形式,方便运营人员调整规则不需要修改代码
- 推送前建议对筛选出的用户做去重和黑名单过滤,避免重复推送或者给拒绝接收的用户推送
- 行为日志表数据量增长较快,建议定期归档历史数据,避免影响查询性能