8月5号新增筛选条件
商户预警筛选功能设计一个「看起来简单」的筛选功能背后隐藏了几个值得深挖的架构判断。一、需求回顾这个功能的起点是一句话连续3天未交易的通过审核商户记录下来方便查哪天有哪些人不交易。随着需求的展开它演变成了一个带有多维筛选的预警系统按公司信息搜索公司名/法人/注册号按审核状态过滤已通过/待审核/已驳回按指定上级手机号查其所有下级的流失数据每个筛选维度背后都有一个值得说说的架构决策。二、筛选维度一公司信息搜索数据来源公司信息法人、注册号、公司名本属于 cn_user_company但我们选择了反规范化——在每日快照写入时把这些字段冗余到 cn_user_churn_warning_record。为什么不联表查最直接的方案是查询时 JOIN cn_user_company但我没有这么做。原因历史快照语义快照记录的是「统计那一天用户的状态」。如果用户之后修改了公司信息JOIN 拿到的是现在的公司信息而不是快照时间点的。冗余字段保证了历史快照的完整性。查询性能cn_user_company 有近万行高频查询时 JOIN 每次都要关联冗余后直接走快照表索引。筛选简洁搜索直接 LIKE business_name 或 LIKE register_number不需要跨表。代价冗余字段在公司信息变更后不自动同步但快照本来就是历史记录这个代价可以接受。三、筛选维度二审核状态过滤设计决策// 前端默认传 companyStatus 1后端 SQL 加过滤if testcompanyStatus ! nulland r.company_status #{companyStatus}/if默认值的选择是这里最重要的决策默认 status1已通过而不是「全部」。理由运营看这个页面的目的是「找需要跟进的活跃商户」未审核或被驳回的商户在这个场景下几乎没有运营价值。所以默认过滤掉降低认知负担。但允许选「全部/待审核/已驳回」给运营留了灵活空间——比如想看「即使是待审核用户也3天没交易」的情况。四、筛选维度三指定上级手机号这是最有技术含量的一个维度也是我做过几次方案选择的地方。数据结构系统的邀请关系通过两个字段记录inviter_id: 直接上级inviter_path: /10/25/30/ 完整邀请链路径inviter_path 是一种树形结构的路径压缩存储用 LIKE 可以高效查任意层级的下级-- 查 user_id25 的所有下级直接间接WHERE inviter_path LIKE %/25/%方案选择Java层 vs SQL层我考虑了两种实现方式方案ASQL子查询AND w.user_id IN (SELECT user_id FROM cn_user WHERE inviter_path LIKE %/X/%)方案BJava层处理// 先查下级列表ListLong subordinates cnUserMapper.getInviterIds2(targetUserId);// 再传给Mapper做IN过滤query.setUserIdList(subordinates);选择方案B理由报错友好手机号不存在时可以提前返回「该用户不存在」而不是静默返回空数据代码清晰查下级和过滤预警是两个独立逻辑放在一起的子查询难以维护符合项目风格getInviterIds2 在项目中已有多处复用不新造轮子扩展灵活下级 ID 列表可以在 Service 层做更多处理如限量、排重但方案B有个隐患下级列表可能非常大间接下级可能数千甚至上万。IN 列表过长会导致 SQL 性能下降。当前数据规模下没有问题但上规模后需要考虑分页或改用关联查询。五、一个踩坑记录XML 不转义在实现「下级过滤」时我在 CnUserMapper.xml 里写了and u.user_id #{getUserId} 在 XML 里是标签起始符必须写成 lt;。这导致 MyBatis 解析 XML 失败整个应用启动退出码1。正确写法and u.user_id lt;gt; #{getUserId}这是 XML 开发中最经典的低级错误之一。MyBatis Mapper 文件是 XML 格式SQL 里涉及比较运算符时必须转义原符号 XML 转义 lt; gt;严格来说 不强制但建议转义 lt;gt; lt;更好的防护方式是用 ![CDATA[...]] 包裹含有特殊字符的 SQL 片段![CDATA[ and u.user_id #{getUserId} ]]CDATA 块内的内容不会被 XML 解析器处理可以写原始 SQL 字符更直观。六、数据快照的语义边界筛选功能的背后其实是「快照表」和「实时联表查询」之间的权衡。快照表的核心价值是历史可追溯 查询性能但它有一个固有的语义问题快照是某一时刻的状态不随时间自动更新。这对筛选有直接影响筛选字段 数据时效 可能的语义问题business_name 快照时间点 用户改了公司名后快照里是旧名字legal_person 快照时间点 同上company_status 快照时间点 状态变更后快照不反映last_trade_time 快照时间点 每天更新较准确当前处理方式每次手动统计或定时任务跑时ON DUPLICATE KEY UPDATE 会刷新当天快照公司信息随之更新。所以实际上每天的快照是当天最新状态只有历史快照如昨天的才可能有偏差。对于运营来说看最新一次快照默认行为时数据是准确的。七、架构总结这个筛选功能的设计体现了几条可以复用的原则原则 体现反规范化换查询效率 冗余公司字段进快照表避免 JOIN默认值决定用户心智 默认 status1降低认知负担Java层做报错SQL层做过滤 下级查询在 Service 层控制边界SQL 层做 IN 过滤XML 特殊字符必须转义 → lt;gt;或用 CDATA 块快照语义需明确边界 快照是时间点状态每日更新保证最新快照准确性筛选功能不难但把它做对——既高效又语义清晰——需要在每个维度上都做出合理的判断。这大概是架构工作的本质不是找最复杂的解而是找在当前约束下最合适的解。先读一下现有的 Mapper 和 Service 代码再写这篇分析。先读一下现有的 Mapper 和 Service 代码再写这篇分析。智能体读取商户预警相关代码思考▼

相关新闻

从零做一个自己的 CLI

从零做一个自己的 CLI

从零做一个自己的 CLI 引言 装过 Claude Code 或 Codex CLI 的人都有同感:终端里敲一行命令,在哪个项目文件夹都能用,不用点开浏览器,也不用先找脚本在哪。 这篇文章做两件事:第一,给已经能跑的 Agent 加…

2026/8/6 6:33:54 阅读更多 →
运算放大器非理想特性解析:从直流精度到动态响应的工程实践

运算放大器非理想特性解析:从直流精度到动态响应的工程实践

1. 从“理想”到“现实”:运算放大器的两面性如果你问一个刚接触模拟电路的学生,运算放大器是什么,他大概率会告诉你:一个增益无穷大、输入阻抗无穷大、输出阻抗为零、带宽无穷大的“神器”。没错,这就是教科书上定义的…

2026/8/6 6:33:54 阅读更多 →
不止影音娱乐!智慧病房专用IPTV系统,解锁病房全新服务形态

不止影音娱乐!智慧病房专用IPTV系统,解锁病房全新服务形态

不止影音娱乐!智慧病房专用IPTV系统,解锁病房全新服务形态随着智慧医院建设持续升级,传统病房电视功能单一、适配性差的短板愈发凸显。区别于普通家用、商用IPTV,智慧病房专用IPTV系统深耕医疗专属场景,搭载多项独有核…

2026/8/6 6:33:54 阅读更多 →

最新新闻

幻兽帕鲁配种公式库:10282条数据驱动的高效繁殖指南

幻兽帕鲁配种公式库:10282条数据驱动的高效繁殖指南

1. 项目概述:从零到万的帕鲁合成公式库如果你也和我一样,是个《幻兽帕鲁》的深度玩家,那你一定经历过这样的时刻:面对两只心爱的帕鲁,心里琢磨着“它俩能生出个啥?”,然后要么去论坛里大海捞针般…

2026/8/6 7:21:22 阅读更多 →
Unity骑士角色模型集成指南:从Humanoid骨骼到动画控制器的实战应用

Unity骑士角色模型集成指南:从Humanoid骨骼到动画控制器的实战应用

1. 项目概述:为什么你需要一个高质量的骑士角色模型?如果你正在开发一款中世纪题材的游戏,或者任何需要战士、守卫、英雄角色的项目,那么“捏人”这个环节绝对是个大工程。从原画设计、高模雕刻、拓扑布线、骨骼绑定到动画制作&am…

2026/8/6 7:21:22 阅读更多 →
多相插值滤波器:DSP采样率转换的高效工程实现

多相插值滤波器:DSP采样率转换的高效工程实现

1. 从“笨办法”到“聪明活儿”:为什么我们需要多相插值滤波器在数字信号处理(DSP)的日常里,插值是个高频操作。简单说,插值就是给信号“升采样”,比如把一段44.1kHz的音频信号,无损地提升到96k…

2026/8/6 7:21:22 阅读更多 →
NVLink与PCIe深度解析:GPU通信性能瓶颈的硬件根源与优化实践

NVLink与PCIe深度解析:GPU通信性能瓶颈的硬件根源与优化实践

1. 从一次真实的性能瓶颈排查说起去年,我参与了一个大规模AI推理集群的优化项目。当时我们遇到一个非常典型的问题:在多GPU服务器上,当模型参数量超过100B,并且需要频繁进行张量并行计算时,我们发现GPU间的数据传输时间…

2026/8/6 7:21:22 阅读更多 →
Python游戏开发实战:从零到百的Pygame项目进阶指南

Python游戏开发实战:从零到百的Pygame项目进阶指南

1. 项目概述:为什么选择用Python做100个游戏?如果你正在学习Python,或者已经学了一段时间语法,但总觉得写出来的代码干巴巴的,没什么成就感,那这个“Python 100个游戏项目”的合集,可能就是为你…

2026/8/6 7:21:22 阅读更多 →
基于RAG与LLM的视频内容理解:从原理到Python实战实现

基于RAG与LLM的视频内容理解:从原理到Python实战实现

最近在尝试各种AI工具时,发现很多开发者对Grok这个新兴的AI助手很感兴趣,特别是它处理视频内容的能力。网上关于“如何进入官网”、“如何安装”的讨论很多,但大多停留在基础操作,对于其核心功能——视频链接的总结与问答——缺乏…

2026/8/6 7:20:22 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →