从业务需求反推关系、文档、时序与向量选型
文章目录每日一句正能量1. 背景与问题2. 环境与数据2.1 关系主数据2.2 文档画像2.3 时序行为2.4 向量意图3. 复现过程3.1 从单一关系模型出发的问题3.2 从单一向量模型出发的问题3.3 从单一文档模型出发的问题3.4 从单一时序模型出发的问题4. 方案实施4.1 决策矩阵4.2 业务需求拆解模板4.3 案例推演智能客户运营4.4 案例推演智能故障检索4.5 选型落地检查4.6 性能和容量约束5. 结果对比6. 风险与复盘6.1 常见风险6.2 上线检查清单6.3 复盘结论每日一句正能量新年启新篇万物焕新颜朝霞捧出希望夜幕垂下安宁。愿你的2026每一步都踏在光的方向每一刻都浸透岁月的醇香。新的一年愿日子如曦光温柔又安详。1. 背景与问题新系统设计时团队很容易从技术栈出发要不要上向量库要不要引入文档数据库时序数据是否需要单独存储关系数据库还能不能扛住这些问题本身并不错误但顺序经常反了。数据模型选型不应从工具开始而应从业务问题开始。业务需求通常会以自然语言出现用户要按客户等级、区域和状态筛选目标客户。 客服要搜索历史对话和工单摘要。 运维要查看某个故障前后 30 分钟指标变化。 知识库要支持“意思相近但关键词不同”的语义搜索。 审计人员要追踪谁在什么时间访问过哪些内容。 运营要把行为趋势、标签和相似意图结合起来做人群筛选。如果把这些需求全部塞进一种数据模型问题会很快出现只用关系表精确过滤强但自然语言相似检索弱。只用文档模型动态结构灵活但事务、约束和复杂关联容易失控。只用时序库指标窗口很强但不适合作为业务主数据中心。只用向量库语义召回方便但权限、版本、状态、审计和强过滤不足。新系统的关键不是“选一个最强数据库”而是明确每类数据承担什么职责并让查询路径可解释、可验证、可扩展。本文以一个“智能客户运营与知识检索平台”为例从业务需求反推关系、文档、时序与向量四类模型的组合方式并给出决策矩阵、表结构、查询案例和风险复盘。2. 环境与数据本文假设环境如下组件用途PostgreSQL 15关系主数据、权限、任务和事务JSONB动态标签、文档属性和扩展字段TimescaleDB客户行为、系统指标和事件轨迹pgvector文档块、会话摘要和相似意图检索对象存储原始附件、导入文件和归档数据查询 API统一鉴权、查询编排、审计和降级平台处理的数据包括客户主数据客户 ID、等级、区域、状态、授权、总消费 文档数据客服摘要、知识库文章、产品说明、故障复盘 时序数据访问、咨询、购买、告警、指标、事件 向量数据客户意图向量、知识块向量、故障描述向量 治理数据资产目录、血缘、质量规则和审计记录。2.1 关系主数据CREATETABLEcustomer(customer_id UUIDPRIMARYKEY,tenant_idTEXTNOTNULL,customer_nameTEXTNOTNULL,customer_levelTEXTNOTNULL,region_codeTEXTNOTNULL,statusTEXTNOTNULLDEFAULTactive,marketing_consentBOOLEANNOTNULLDEFAULTFALSE,total_spendNUMERIC(14,2)NOTNULLDEFAULT0,created_at TIMESTAMPTZNOTNULLDEFAULTnow(),updated_at TIMESTAMPTZNOTNULLDEFAULTnow());CREATEINDEXidx_customer_business_filterONcustomer(tenant_id,status,marketing_consent,customer_level,region_code);关系模型适合承载强一致、强约束和高频过滤条件例如租户、状态、权限、客户等级和营销授权。2.2 文档画像CREATETABLEcustomer_profile_document(profile_id UUIDPRIMARYKEY,customer_id UUIDNOTNULLREFERENCEScustomer(customer_id),tenant_idTEXTNOTNULL,summaryTEXTNOTNULL,tags JSONBNOTNULLDEFAULT{}::jsonb,source_typeTEXTNOTNULL,content_hashTEXTNOTNULL,statusTEXTNOTNULLDEFAULTactive,updated_at TIMESTAMPTZNOTNULLDEFAULTnow());CREATEINDEXidx_profile_tagsONcustomer_profile_documentUSINGGIN(tags);文档模型适合保存动态属性和可解释内容例如客户偏好、客服摘要、产品兴趣、风险标签和来源说明。2.3 时序行为CREATEEXTENSIONIFNOTEXISTStimescaledb;CREATETABLEcustomer_event(ts TIMESTAMPTZNOTNULL,tenant_idTEXTNOTNULL,customer_id UUIDNOTNULL,event_typeTEXTNOTNULL,event_valueNUMERIC(14,2),attributes JSONBNOTNULLDEFAULT{}::jsonb);SELECTcreate_hypertable(customer_event,by_range(ts),if_not_existsTRUE);CREATEINDEXidx_customer_event_lookupONcustomer_event(tenant_id,customer_id,event_type,tsDESC);时序模型适合回答“何时发生、持续多久、趋势如何、窗口内是否异常”。2.4 向量意图CREATEEXTENSIONIFNOTEXISTSvector;CREATETABLEcustomer_intent_vector(vector_id UUIDPRIMARYKEY,customer_id UUIDNOTNULLREFERENCEScustomer(customer_id),tenant_idTEXTNOTNULL,source_profile_id UUIDNOTNULLREFERENCEScustomer_profile_document(profile_id),embedding_modelTEXTNOTNULL,embedding_dimensionINTNOTNULL,embedding VECTOR(768)NOTNULL,content_hashTEXTNOTNULL,statusTEXTNOTNULLDEFAULTactive,created_at TIMESTAMPTZNOTNULLDEFAULTnow());CREATEINDEXidx_customer_intent_vector_hnswONcustomer_intent_vectorUSINGhnsw(embedding vector_cosine_ops);CREATEINDEXidx_customer_intent_filterONcustomer_intent_vector(tenant_id,status,customer_id);向量模型适合表达“语义相似”例如相似问题、相似客户意图、相似故障描述和相似文档块。3. 复现过程3.1 从单一关系模型出发的问题假设业务要找出“高价值但近期表达价格敏感的客户”。只用关系表可以写SELECTcustomer_id,customer_name,total_spendFROMcustomerWHEREtenant_idtenant_aANDstatusactiveANDmarketing_consentTRUEANDcustomer_levelIN(gold,platinum)ANDtotal_spend5000;这条 SQL 可以找到合规且高价值的客户但无法判断客户是否“价格敏感”。如果把价格敏感做成枚举标签维护成本会很高因为用户表达方式非常多续费有点贵 别家报价更低 有没有保价 预算今年缩减 优惠到期后暂时不续。3.2 从单一向量模型出发的问题如果只用向量检索“价格敏感”意图SELECTcustomer_id,1-(embedding$1::vector)ASsimilarityFROMcustomer_intent_vectorWHEREtenant_idtenant_aANDstatusactiveORDERBYembedding$1::vectorLIMIT100;它能找到语义相近的客户但可能返回未授权营销触达的客户。已注销或冻结客户。不在当前活动区域的客户。低价值客户或不符合活动规则的客户。向量来自旧摘要或旧模型版本的客户。这说明向量检索不能替代关系约束。3.3 从单一文档模型出发的问题把所有客户资料都放到 JSONB 或文档库中短期看灵活{customer_level:gold,region_code:CN-SH,marketing_consent:true,preferences:{channel:wechat,products:[database,monitoring]}}但当系统需要强约束和审计时问题会显现营销授权是否必须非空 客户状态有哪些合法值 同一租户下客户编号是否唯一 如何保证权限字段不会被随意写错 高频过滤字段是否每次都走 JSONB 解析核心业务事实应结构化动态标签再放文档字段。3.4 从单一时序模型出发的问题时序表适合行为轨迹SELECTtime_bucket(1 day,ts)ASday,count(*)ASvisitsFROMcustomer_eventWHEREtenant_idtenant_aANDcustomer_id$1ANDevent_typepage_viewANDtsnow()-interval30 daysGROUPBYdayORDERBYday;但时序数据不能独立回答客户是否可触达、是否有权限、是否属于目标区域也不能直接处理自然语言相似意图。它需要与关系主数据、文档标签和向量结果组合。4. 方案实施4.1 决策矩阵业务问题关系模型文档模型时序模型向量模型推荐职责客户是否可触达强中弱弱关系字段作为强约束客户有哪些偏好中强中中JSONB 标签和摘要解释最近是否活跃弱弱强弱时序窗口计算是否表达相似意图弱中弱强向量 Top-K 召回是否属于某业务域强强中弱关系列 标签组合是否越权访问强中中弱关系权限下推结果为什么被选中中强中中文档摘要 指标 相似度模型是否需要重建中强弱强content_hash model_version选型原则强一致、强约束、高频过滤优先关系模型 结构变化快、解释性强、标签丰富优先文档模型 时间窗口、趋势、峰值和连续性优先时序模型 语义相似、模糊表达和 Top-K优先向量模型。4.2 业务需求拆解模板每个需求进入设计前先回答1. 业务对象是什么客户、文档、设备、订单还是故障 2. 哪些条件必须精确过滤租户、权限、状态、区域、时间 3. 哪些字段会频繁作为查询条件 4. 哪些属性变化快是否适合 JSONB 5. 是否需要按时间窗口计算趋势 6. 是否需要语义相似或模糊检索 7. 是否需要结果解释和审计 8. 数据是否可从上游重建 9. RTO、RPO、延迟和吞吐目标是什么这个模板可以避免“先选技术再找场景”的设计偏差。4.3 案例推演智能客户运营业务目标找出高价值、可营销触达、近 30 天有访问行为、且与“价格敏感和续费犹豫”语义相似的客户。拆解如下条件数据模型原因高价值客户关系total_spend、customer_level可精确过滤可营销触达关系合规强约束不能后置过滤近 30 天有行为时序需要时间窗口统计价格敏感意图向量用户表达不固定适合语义检索偏好微信渠道文档动态标签变化快输出解释文档 时序 向量摘要、近期行为、相似度共同说明真实联合查询WITHeligible_customerAS(SELECTcustomer_id,customer_name,customer_level,region_code,total_spendFROMcustomerWHEREtenant_id$2ANDstatusactiveANDmarketing_consentTRUEANDcustomer_levelIN(gold,platinum)ANDtotal_spend5000),recent_behaviorAS(SELECTcustomer_id,count(*)FILTER(WHEREevent_typepage_view)ASpage_views_30d,count(*)FILTER(WHEREevent_typeconsultation)ASconsultations_30d,max(ts)ASlast_active_atFROMcustomer_eventWHEREtenant_id$2ANDtsnow()-interval30 daysGROUPBYcustomer_id),semantic_candidateAS(SELECTv.customer_id,max(1-(v.embedding$1::vector))ASsemantic_scoreFROMcustomer_intent_vector vJOINeligible_customer cONc.customer_idv.customer_idWHEREv.tenant_id$2ANDv.statusactiveANDv.embedding_modelembedding-model-v2ANDv.embedding_dimension768GROUPBYv.customer_idORDERBYmax(1-(v.embedding$1::vector))DESCLIMIT200)SELECTc.customer_id,c.customer_name,c.customer_level,c.region_code,c.total_spend,p.summary,p.tags,b.page_views_30d,b.consultations_30d,b.last_active_at,s.semantic_score,s.semantic_score*0.75ln(1coalesce(b.consultations_30d,0))*0.15ln(1coalesce(b.page_views_30d,0))*0.10ASfinal_scoreFROMsemantic_candidate sJOINeligible_customer cONc.customer_ids.customer_idJOINrecent_behavior bONb.customer_ids.customer_idLEFTJOINcustomer_profile_document pONp.customer_ids.customer_idANDp.statusactiveWHEREp.tags {preferred_channel:wechat}ORDERBYfinal_scoreDESCLIMIT20;这条 SQL 的职责分配清晰关系先确定合规和业务候选 时序确认近期活跃度 向量在候选中寻找相似意图 文档提供偏好标签和解释摘要。4.4 案例推演智能故障检索业务目标输入一段故障描述返回相似故障复盘并展示故障发生前后 30 分钟关键指标。表结构示例CREATETABLEincident_document(document_id UUIDPRIMARYKEY,tenant_idTEXTNOTNULL,incident_id UUIDNOTNULL,titleTEXTNOTNULL,severityTEXTNOTNULL,statusTEXTNOTNULLDEFAULTpublished,metadata JSONBNOTNULLDEFAULT{}::jsonb,content_hashTEXTNOTNULL,updated_at TIMESTAMPTZNOTNULLDEFAULTnow());CREATETABLEincident_metric(ts TIMESTAMPTZNOTNULL,tenant_idTEXTNOTNULL,incident_id UUIDNOTNULL,metric_nameTEXTNOTNULL,valueDOUBLEPRECISIONNOTNULL,labels JSONBNOTNULLDEFAULT{}::jsonb);SELECTcreate_hypertable(incident_metric,by_range(ts),if_not_existsTRUE);联合查询WITHsimilar_incidentAS(SELECTd.incident_id,d.document_id,d.title,d.severity,1-(v.embedding$1::vector)ASsimilarityFROMincident_document dJOINknowledge_chunk vONv.document_idd.document_idWHEREd.tenant_id$2ANDd.statuspublishedANDv.statusactiveORDERBYv.embedding$1::vectorLIMIT10),metric_windowAS(SELECTm.incident_id,m.metric_name,avg(m.value)ASavg_value,max(m.value)ASmax_valueFROMincident_metric mJOINsimilar_incident sONs.incident_idm.incident_idWHEREm.tenant_id$2ANDm.ts$3::timestamptz-interval30 minutesANDm.ts$3::timestamptzinterval30 minutesGROUPBYm.incident_id,m.metric_name)SELECTs.incident_id,s.title,s.severity,s.similarity,jsonb_agg(jsonb_build_object(metric_name,m.metric_name,avg_value,m.avg_value,max_value,m.max_value))ASmetricsFROMsimilar_incident sLEFTJOINmetric_window mONm.incident_ids.incident_idGROUPBYs.incident_id,s.title,s.severity,s.similarityORDERBYs.similarityDESC;这里向量负责找相似故障关系负责租户、状态和严重级别文档负责标题和复盘内容时序负责故障窗口的指标证据。4.5 选型落地检查选型阶段必须明确哪些能力是“必须内建”哪些可以后续演进。能力初版必须可后续增强租户和权限隔离是否主数据强约束是否文档动态标签是可逐步扩展时序窗口查询视业务而定可从日志归档演进向量语义检索视业务而定可先做关键词检索向量离线评估上线前必须后续扩充样本数据血缘和质量规则基础必须深度治理可迭代备份恢复演练是否4.6 性能和容量约束选型不能只看功能还要看资源模型。关系模型索引越多写入和 WAL 成本越高 文档模型JSONB 灵活但高频字段应结构化 时序模型写入量和保留周期决定容量 向量模型维度、分块数、模型并存和索引决定空间 联合查询过滤顺序和候选集大小决定延迟。压测至少覆盖关系过滤 JSONB 标签过滤 时序窗口聚合 向量 Top-K 关系 文档 时序 向量联合查询 导入、索引构建和在线查询并发场景。5. 结果对比以下为示例评估场景为智能客户运营系统。方案可解释性查询灵活性合规控制语义检索时序分析复杂度纯关系模型中中强弱弱低关系 JSONB强强强弱弱中关系 JSONB 时序强强强弱强中关系 JSONB 向量强强强强弱中高关系 JSONB 时序 向量很强很强强强强高示例性能结果查询类型P95 延迟说明关系过滤客户18 msB-tree 索引命中JSONB 标签过滤45 msGIN 索引命中近 30 天行为聚合82 msTimescaleDB 时间窗口向量 Top-2095 msHNSW 索引客户运营联合查询180 ms多阶段候选 重排故障检索联合查询210 ms向量召回 时序窗口示例结论如果系统只做后台管理关系模型和少量 JSONB 足够 如果系统需要动态画像文档标签应纳入设计 如果系统需要行为趋势、故障窗口或指标分析必须引入时序模型 如果系统需要自然语言相似检索应引入向量模型 如果系统要做智能运营或智能故障分析应采用多模组合但必须配套治理、评估和性能基线。6. 风险与复盘6.1 常见风险风险表现应对从技术栈出发系统复杂但不能解决核心问题从业务问题反推模型过早引入向量成本高但收益不清先定义语义检索场景和评估集所有字段放 JSONB查询慢且约束弱高频和强约束字段结构化忽略时序模型行为趋势无法分析明确时间窗口和保留周期向量替代权限过滤返回不合规结果关系权限必须前置缺少模型版本无法重建或对比记录 content_hash 和 model_version只设计表结构无法证明查询有效提供真实联合查询和执行计划缺少数据治理数据越多越不可控元数据、质量和血缘同步设计未规划容量模型升级时空间翻倍计算向量、索引和备份空间6.2 上线检查清单[ ] 已从业务问题拆解出对象、条件、窗口和语义需求 [ ] 租户、权限、状态和合规字段已结构化 [ ] 动态标签和解释信息已归入文档模型 [ ] 时间窗口、趋势和事件轨迹已归入时序模型 [ ] 模糊表达和相似检索已归入向量模型 [ ] 高频 JSONB 字段已评估是否需要列化 [ ] 向量模型、维度、内容哈希和版本已登记 [ ] 已设计真实关系、文档、时序、向量联合查询 [ ] 已评估性能、容量、备份和恢复策略 [ ] 已建立质量规则、权限验证和离线评估方案 [ ] 已明确哪些能力初版必须上线哪些可以迭代 [ ] 已完成风险复盘和回滚方案6.3 复盘结论关系、文档、时序与向量不是互相替代的模型而是解决不同类型业务问题的工具。合理选型的关键是先理解需求中的数据语义。可以用以下方式快速判断需要“是否符合条件”优先关系模型 需要“属性灵活和解释”优先文档模型 需要“何时发生和趋势”优先时序模型 需要“意思相近和 Top-K”优先向量模型。新系统设计推荐流程收集业务问题 - 拆解查询条件 - 区分强约束和弱排序 - 判断是否需要时间窗口 - 判断是否需要语义相似 - 建立决策矩阵 - 设计最小可用模型 - 编写真实联合查询 - 做性能、质量和恢复验证最终验收不能只看“用了哪些先进技术”而要回答每个业务问题由哪类数据模型负责强约束是否在数据库层前置过滤动态标签是否有统一字典和质量规则时序数据是否覆盖关键窗口和保留周期向量数据是否记录模型版本、维度和内容哈希联合查询是否有稳定的执行计划和性能基线数据是否可备份、可恢复、可追溯和可审计当业务需求、决策矩阵、数据模型、真实查询和治理规则形成闭环后模型选型就不再是技术偏好之争而是可以被验证的系统设计决策。转载自欢迎 点赞✍评论⭐收藏欢迎指正