当前位置: 首页 > article >正文

从产品需求倒推:如何用FastAPI为你的‘用户画像’功能设计JSON数据模型?

从产品需求倒推如何用FastAPI为你的‘用户画像’功能设计JSON数据模型当产品经理在白板上画出用户画像功能的需求草图时后端开发者需要思考的远不止数据库字段设计。一个真正可扩展的动态属性系统应该像乐高积木一样允许业务团队自由组合用户特征同时保持后端查询的高效性。本文将带你从零构建一个支持嵌套标签、动态属性和复杂查询的用户画像系统。1. 解构用户画像的产品需求产品需求文档中支持自定义标签这句话背后往往隐藏着复杂的业务逻辑。我们先拆解典型用户画像系统的核心要素基础属性姓名、年龄等固定字段行为标签如月活跃用户、高消费客户等业务标记动态偏好用户自行设置的兴趣标签统计指标最近30天登录次数等计算字段# 用户画像数据结构原型 user_profile { basic_info: { name: 张三, age: 28, location: 北京 }, tags: [科技爱好者, 早期用户], preferences: { programming_languages: [Python, Rust], hobbies: [登山, 摄影] }, metrics: { last_active_days: 3, purchase_count_30d: 5 } }提示在设计初期就考虑字段的查询频率高频查询字段应单独存储而非全部放入JSON2. PostgreSQL中的JSONB架构设计PostgreSQL的JSONB类型提供了强大的JSON处理能力但合理的结构设计直接影响查询性能。以下是用户画像表的推荐结构字段名类型描述索引建议idSERIAL主键主键索引basic_infoJSONB基础信息GIN索引dynamic_attributesJSONB动态属性GIN索引created_atTIMESTAMP创建时间B树索引updated_atTIMESTAMP更新时间B树索引-- 创建支持高效查询的用户表 CREATE TABLE user_profiles ( id SERIAL PRIMARY KEY, basic_info JSONB NOT NULL, dynamic_attributes JSONB NOT NULL DEFAULT {}::JSONB, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- 为JSONB字段创建GIN索引 CREATE INDEX idx_profile_attributes ON user_profiles USING GIN (dynamic_attributes); CREATE INDEX idx_basic_info ON user_profiles USING GIN (basic_info);3. FastAPI中的Pydantic模型设计Pydantic模型是FastAPI与前端交互的契约也是数据验证的第一道防线。我们设计分层模型来处理用户画像的复杂性from typing import List, Dict, Optional from pydantic import BaseModel class BasicInfo(BaseModel): name: str age: int location: str email: str class Preference(BaseModel): programming_languages: List[str] [] hobbies: List[str] [] class UserMetrics(BaseModel): last_active_days: int purchase_count_30d: int class UserProfileCreate(BaseModel): basic_info: BasicInfo preferences: Preference metrics: UserMetrics class UserProfileResponse(UserProfileCreate): id: int created_at: datetime updated_at: datetime4. 实现复杂查询接口真正的业务价值往往体现在复杂查询能力上。以下是支持嵌套JSON查询的几种实现方式4.1 基础过滤查询app.get(/users/) async def search_users( location: Optional[str] None, min_age: Optional[int] None, db: Session Depends(get_db) ): query db.query(UserProfile) if location: query query.filter( UserProfile.basic_info[location].astext location ) if min_age: query query.filter( UserProfile.basic_info[age].astext.cast(Integer) min_age ) return query.all()4.2 高级JSON路径查询from sqlalchemy import text app.get(/users/by-interest/) async def search_by_interest( language: str, hobby: str, db: Session Depends(get_db) ): return db.query(UserProfile).filter( text( dynamic_attributes-preferences-programming_languages ? :lang AND dynamic_attributes-preferences-hobbies ? :hobby ).params(langlanguage, hobbyhobby) ).all()4.3 聚合查询示例from sqlalchemy import func app.get(/users/age-stats/) async def get_age_stats(db: Session Depends(get_db)): return db.execute( text( SELECT AVG((basic_info-age)::INT) as avg_age, PERCENTILE_CONT(0.5) WITHIN GROUP ( ORDER BY (basic_info-age)::INT ) as median_age FROM user_profiles ) ).fetchone()5. 性能优化实战技巧当用户画像数据量达到百万级时这些优化策略能显著提升性能部分JSONB字段提取将高频查询字段从JSONB中提取为单独列ALTER TABLE user_profiles ADD COLUMN location TEXT; UPDATE user_profiles SET location basic_info-location; CREATE INDEX idx_location ON user_profiles(location);表达式索引为特定JSON路径创建专用索引CREATE INDEX idx_programming_lang ON user_profiles USING GIN ((dynamic_attributes-preferences-programming_languages));物化视图为复杂聚合查询创建预计算视图CREATE MATERIALIZED VIEW user_segments AS SELECT id, (basic_info-location) as location, (dynamic_attributes-metrics-purchase_count_30d)::INT as purchases FROM user_profiles WHERE (dynamic_attributes-metrics-purchase_count_30d)::INT 5;6. 生产环境注意事项在实际部署时这些经验教训值得注意数据迁移策略当需要修改JSON结构时采用渐进式迁移# 迁移脚本示例 def migrate_tags_to_preferences(db: Session): users db.query(UserProfile).filter( UserProfile.dynamic_attributes[tags].isnot(None) ).all() for user in users: tags user.dynamic_attributes.get(tags, []) if tags: user.dynamic_attributes.setdefault(preferences, {}) user.dynamic_attributes[preferences][legacy_tags] tags del user.dynamic_attributes[tags] db.commit()查询性能监控设置慢查询日志捕获JSONB查询# postgresql.conf log_min_duration_statement 100 log_statement all缓存策略对热点用户画像实现Redis缓存from fastapi_cache import FastAPICache from fastapi_cache.backends.redis import RedisBackend from fastapi_cache.decorator import cache app.get(/users/{user_id}) cache(expire300) async def get_user(user_id: int, db: Session Depends(get_db)): return db.query(UserProfile).get(user_id)在最近的一个电商项目中我们采用这种架构处理了超过200万用户的画像数据。最复杂的查询涉及3层嵌套JSON路径过滤响应时间从最初的1200ms优化到了80ms关键是将高频过滤条件提取为单独列并建立复合索引。

相关文章:

从产品需求倒推:如何用FastAPI为你的‘用户画像’功能设计JSON数据模型?

从产品需求倒推:如何用FastAPI为你的‘用户画像’功能设计JSON数据模型? 当产品经理在白板上画出"用户画像"功能的需求草图时,后端开发者需要思考的远不止数据库字段设计。一个真正可扩展的动态属性系统,应该像乐高积木…...

gpt-2-simple代码实现原理:深入理解Transformer架构和训练机制

gpt-2-simple代码实现原理:深入理解Transformer架构和训练机制 【免费下载链接】gpt-2-simple Python package to easily retrain OpenAIs GPT-2 text-generating model on new texts 项目地址: https://gitcode.com/gh_mirrors/gp/gpt-2-simple gpt-2-simpl…...

Nunchaku-flux-1-dev多场景落地手册:教育课件插图、文旅宣传海报、非遗数字藏品生成

Nunchaku-flux-1-dev多场景落地手册:教育课件插图、文旅宣传海报、非遗数字藏品生成 1. 引言:从技术到价值,本地化AI绘画的实战机遇 如果你是一位教育工作者,是否曾为寻找一张贴合课程内容的插图而翻遍图库,最终只能…...

基于COM接口的MATLAB与Origin自动化数据管道构建

1. 为什么需要MATLAB与Origin自动化数据管道 做科研或者工程的朋友们肯定都遇到过这样的场景:每次实验或仿真都会产生一大堆.txt格式的数据文件,需要手动导入Origin做可视化分析。更头疼的是,这些数据可能分散在不同文件夹,格式还…...

2026 年金三银四版互联网大厂 Java 面试指南

现在Java面试都只是背答案吗? 不背就通过不了面试,但是现在面试都问原理、问场景!Java 面试题就像我们高考时的文言文,包括古诗词,不背是不可能答出来的!当然了,除了背,还得理解&am…...

Java并发——CAS(比较并替换)

在多线程编程中,如何安全地修改共享变量是永恒的课题。传统的synchronized关键字虽然保证了线程安全,但基于互斥锁的机制会导致线程阻塞、上下文切换,在竞争激烈的场景下可能成为性能瓶颈。于是,一种更轻量的同步方案——CAS&…...

Crypto Trading Bot 交易所集成详解:Bitmex、Binance、Bybit 实战指南

Crypto Trading Bot 交易所集成详解:Bitmex、Binance、Bybit 实战指南 【免费下载链接】crypto-trading-bot Cryptocurrency trading bot in javascript for Bitfinex, Bitmex, Binance, Bybit ... (public edition) 项目地址: https://gitcode.com/gh_mirrors/cr…...

避坑指南:Windows下用llama.cpp部署DeepSeek量化模型遇到的7个典型报错

避坑指南:Windows下用llama.cpp部署DeepSeek量化模型遇到的7个典型报错 在Windows平台上部署量化模型时,开发者常常会遇到各种意想不到的问题。本文将基于真实踩坑经历,详细解析7个典型报错及其解决方案,帮助开发者快速定位并解决…...

实战指南:主流图像篡改检测数据集深度解析与应用

1. 图像篡改检测数据集的重要性与挑战 在数字图像处理领域,图像篡改检测技术正变得越来越重要。随着Photoshop等图像编辑工具的普及,任何人都能轻松修改图片内容。从社交媒体上的虚假新闻到法庭上的证据伪造,篡改图像带来的问题已经渗透到我们…...

用PPO算法搞定机器人仿真参数调优:从零到一的Isaac Gym实战指南

用PPO算法搞定机器人仿真参数调优:从零到一的Isaac Gym实战指南 在机器人仿真开发中,参数调优一直是个令人头疼的问题。想象一下,你花了几周时间搭建了一个完美的机器人模型,却发现它在仿真环境中的表现和预期相差甚远——关节太僵…...

声音克隆黑科技!用Fish Speech 1.5上传5秒音频,克隆你的专属语音

声音克隆黑科技!用Fish Speech 1.5上传5秒音频,克隆你的专属语音 1. 引言:你的声音也能被克隆? 想象一下,你只需要录制5秒钟的语音,就能让AI学会你的声音特点,然后用你的声音说出任何你想说的…...

Phi-4-mini-reasoning在Linux环境下的部署与优化指南

Phi-4-mini-reasoning在Linux环境下的部署与优化指南 1. 开篇:为什么选择Phi-4-mini-reasoning 如果你正在寻找一个既轻量又强大的推理模型,Phi-4-mini-reasoning绝对值得关注。这个只有3.8B参数的小模型,在数学推理和逻辑分析任务上的表现…...

Nanbeige4.1-3B详细步骤:transformers>=4.51.0兼容性验证与避坑指南

Nanbeige4.1-3B详细步骤:transformers>4.51.0兼容性验证与避坑指南 最近在部署一个挺有意思的小模型——Nanbeige4.1-3B。别看它只有30亿参数,但在推理、代码生成这些任务上表现相当亮眼。不过,我在实际部署时遇到了一个关键问题&#xf…...

路径规划地图表示终极指南:5分钟搞懂两种核心方法如何选型

路径规划地图表示终极指南:5分钟搞懂两种核心方法如何选型 【免费下载链接】PathPlanning Common used path planning algorithms with animations. 项目地址: https://gitcode.com/gh_mirrors/pa/PathPlanning 路径规划是机器人导航、自动驾驶等领域的核心技…...

血浆蛋白质组学在46,165名成人中识别出与发作抑郁相关的蛋白质和通路

论文总结1、识别出与抑郁症发病相关的血浆蛋白质特征,明确了其与抑郁症发病风险的关联模式(正向/负向关联)2、通过MetaSpace和Cytoscape (v3.10.2)解析相关蛋白质涉及的生物学通路(GO,KEGG),通过孟德尔随机…...

MogFace效果展示:精准识别水墨画中抽象人脸,看AI如何理解艺术

MogFace效果展示:精准识别水墨画中抽象人脸,看AI如何理解艺术 1. 引言:AI与水墨艺术的跨时空对话 水墨画作为中国传统艺术的精髓,以其独特的写意风格和留白意境闻名于世。画家们常常通过寥寥数笔勾勒人物神韵,这种高…...

ArcMap拓扑检查保姆级教程:从创建地理数据库到错误导出,一步不落

ArcMap拓扑检查全流程实战指南:从数据准备到错误修正 在地理信息系统(GIS)数据生产过程中,拓扑检查是确保数据质量的关键环节。无论是土地确权、管线网络还是城市规划数据,拓扑错误都可能导致分析结果偏差甚至决策失误…...

Anaconda环境下Shadow Sound Hunter模型开发环境搭建

Anaconda环境下Shadow & Sound Hunter模型开发环境搭建 最近有不少朋友在尝试运行一些有趣的AI模型时,被环境配置搞得头大。尤其是像Shadow & Sound Hunter这类结合了视觉和音频处理的模型,依赖库又多又杂,版本冲突是家常便饭。今天…...

ZeroTier进阶指南:基于Docker的自建PLANET与Controller部署实战

1. 为什么需要自建ZeroTier基础设施 当你使用ZeroTier组建虚拟局域网时,所有节点默认都会连接到官方运营的PLANET根服务器。这个设计虽然方便,但在实际使用中会遇到几个明显问题。首先是延迟问题,由于官方服务器都部署在海外,国内…...

YOLO12惊艳效果:强反射玻璃幕墙中人物与车辆穿透式检测

YOLO12惊艳效果:强反射玻璃幕墙中人物与车辆穿透式检测 1. 技术背景与挑战 在现代城市环境中,玻璃幕墙建筑已经成为主流设计元素。这些闪亮的玻璃表面虽然美观,却给计算机视觉系统带来了巨大挑战。强反射、光线干扰、镜像效应等问题&#x…...

RMBG-2.0行业落地:教育机构课件配图、MCN机构短视频封面批量去背实操

RMBG-2.0行业落地:教育机构课件配图、MCN机构短视频封面批量去背实操 1. 引言:当“抠图”不再是设计师的专属技能 想象一下这个场景:一位中学老师正在准备下周的生物课课件,需要一张清晰的青蛙解剖图作为配图。她在网上找到了一…...

单片机烧录全流程实战:UART/ST-LINK/SWD工具链详解

1. 单片机开发实践入门:从烧录工具链到工程落地的完整闭环单片机课程长期存在一个显著悖论:它被定义为一门以硬件交互、外设驱动和实时控制为核心的实践性技术课程,但在实际教学与自学路径中,却普遍演变为汇编指令背诵、寄存器位定…...

移动机器人路径规划这事儿吧,光靠传统算法是真费劲。今天咱们聊聊怎么用Q-learning让机器人自己学会找路,MATLAB代码实操走起

机器人路径优化:基于强化学习Q-learning算法的移动机器人路径优化MATLAB先整一个5x5的网格环境,障碍物直接用矩阵标记。看这段初始化代码: grid_size [5,5]; start [1,1]; goal [5,5]; obstacles [2,2;3,3;4,4]; q_table zeros(prod(gr…...

YOLO26目标检测实战:官方镜像一键部署,轻松实现图片视频检测

YOLO26目标检测实战:官方镜像一键部署,轻松实现图片视频检测 1. 为什么选择YOLO26官方镜像? YOLO26作为目标检测领域的最新成果,在精度和速度上都有了显著提升。但对于大多数开发者来说,从零开始搭建YOLO26的开发环境…...

Qwen-Ranker Pro应用场景:跨境电商商品描述跨语言语义匹配

Qwen-Ranker Pro应用场景:跨境电商商品描述跨语言语义匹配 1. 引言 你有没有遇到过这样的问题?在跨境电商平台上,用中文搜索“防水运动手表”,结果出来的商品描述里,英文写着“waterproof sports watch”&#xff0c…...

Qwen3-32B+Clawdbot部署教程:基于Linux服务器的生产环境完整配置

Qwen3-32BClawdbot部署教程:基于Linux服务器的生产环境完整配置 1. 引言:为什么需要私有化部署大模型聊天平台? 想象一下这个场景:你的团队需要一个智能助手来处理内部文档、回答技术问题,甚至辅助代码编写。但使用公…...

SiameseUIE部署教程:小内存实例中模型加载与推理内存占用优化

SiameseUIE部署教程:小内存实例中模型加载与推理内存占用优化 1. 为什么在小内存实例上部署SiameseUIE是个挑战? 你有没有试过在一台只有4GB内存、系统盘不到50G的云服务器上跑信息抽取模型?刚解压模型权重就提示磁盘空间不足,p…...

探索NEU - DET数据集:表面缺陷检测的宝库

NEU-DET数据集包含了六种主要的表面缺陷类别,包括:缺陷、涂层剥落、油污、锈蚀、划痕和水印。 每种类型缺陷各300个样本,总共1800张灰度图像,每张图像原始分辨率为200*200像素。 其中训练集为1620张,测试集为180张。 对…...

5分钟搞定translategemma-12b-it部署:本地化图文翻译不求人

5分钟搞定translategemma-12b-it部署:本地化图文翻译不求人 1. 为什么你需要一个能“看懂”图片的翻译工具? 想象一下这个场景:你收到一份英文的产品说明书PDF,里面全是图表和带文字的截图。你打开翻译软件,发现它只…...

锂电池全自动裁切喷码机项目技术分享

三菱FX5U程序,双FX5U80MT主从站控制,普洛菲斯触摸 屏程序,搭配三菱伺服,松下变频器控制运动控制数轴运动控制。 FX5-485ADP模块通信应用控制,以太网通信应用控制 锂电池全自动裁切喷码机 多工位转盘控制分类&#xff…...