当你把所有表都关联好之后,是时候写点查询语句了。不过只写几个查询那是新手干的事。你已经是专业选手了,所以你得写50(!)个查询!而且这些都是最有用的。
数据库查询
1. 获取展示用商品列表
这个查询会返回所有激活的商品,带上主价格和图片,用于首页和目录展示。这样可以快速生成商品橱窗,保证商品信息的实时性。
2. 按关键词搜索商品
让用户可以通过名字或描述里的关键词找到他们感兴趣的商品。这是目录快速搜索的核心功能。
3. 根据ID获取商品详情页
返回某个商品的详细信息,包括品牌和分类。用于商品详情页展示。
4. 商品所有SKU列表
展示商品所有可选SKU:尺码、颜色、库存、价格。用于商品页选择不同规格。
5. 商品图片库
完整展示商品卡片时,所有图片都很重要。这个查询会返回所有图片,并标明主图。
6. 商品平均评分和评论数
用于展示商品评分和评论数量,对买家信任和口碑很重要。
7. 商品详细评论列表
商品详情页的评论区:评分、内容、作者和评论时间。帮助新买家做决策。
8. 商品问答
获取每个商品的问答,用于FAQ板块。
9. 带层级的商品分类
可视化目录结构,构建过滤和菜单的导航树。
10. 按分类及子分类获取商品
展示选中分类及其“子分类”下的所有商品(支持多级嵌套)。
11. 品牌列表
用于品牌过滤、品牌列表页和品牌落地页。
12. 热门标签及商品数量
分析最常用标签,用于展示热门商品和构建标签云。
13. 商品价格变动历史
用于分析和展示价格动态(原价/现价、促销等)。
14. 商品状态变更历史
追踪商品生命周期,分析下架或返场原因。
15. 按证书和许可证搜索
对专业买家和B2B用户很关键(产品质量和合法性)。
16. 商品供应商信息
用于后台管理、质量控制和供应商沟通。
17. 按仓库查询商品库存
实时监控各仓库库存。对物流系统和防止“缺货”很重要。
18. 库存低于阈值的商品
自动补货,防止因缺货损失销售。
19. 商品仓库流转(审计)
追踪商品在选定时间段内的所有流转:入库、出库、调整。用于盘点和防损。
20. 仓库间物流调拨
查看商品在物流中心间的调拨历史和状态。
21. 配送方式和运费
用于结算运费和下单时给用户展示。
22. 用户订单历史
个人中心最重要的部分——所有订单、状态和金额。
23. 订单详情及商品项
获取订单完整结构——商品、价格、数量。用于前端展示或客服支持。
24. 按时间和状态统计订单
销售分析和报表,按时间段和状态(比如“已完成”)返回订单。
25. “遗弃”购物车
给市场部用的分析:用户没下单的购物车——可用于再营销。
26. 热销榜
“畅销商品”区块和营销推荐:哪些商品最常被买。
27. 按天统计销售额(用于图表)
每日营收报表——业务动态分析和图表基础。
28. 退货列表
展示所有订单的退货及原因和状态,分析退货原因。
29. 订单取消列表
监控损失和取消原因:显示取消原因、操作人和时间。
30. 待发货订单
仓库和配送用——需要打包发货的订单及配送详情。
31. 平均客单价
“Average Order Value”——评估营销和品类效率的关键指标。
32. 使用过优惠码的订单
分析促销效果:哪些优惠码被用过、用得多不多。
33. 按分类和品牌统计折扣使用
评估哪些活动有效,监控各品类和品牌的折扣受欢迎程度。
34. 已用优惠码及其用户
监控优惠码使用,发现异常和滥用。
35. 订单支付历史
客服和财务用:显示所有支付交易、状态和支付方式。
36. 退款订单
分析退款、生成财务报表和防止欺诈。
37. 用户钱包余额和交易历史
监控和展示用户的奖励或返现余额及其流转历史。
38. 用户客服工单
让用户看到自己的工单和处理状态。
39. 客服工单SLA分析
分析各优先级的平均响应和解决时间,便于SLA管理。
40. 工单消息列表
查看选中工单的全部对话,对用户和客服都很重要。
41. 按分类展示活跃FAQ
给客户知识库展示常见问题,减轻客服压力。
42. 活跃营销活动和Banner
用于网站展示最新的广告和促销。
43. 首页精选商品
“精选”区块:需要在首页重点展示的商品。
44. A/B测试历史
分析实验结果,优化用户体验和营销。
45. 用户浏览商品历史
展示“你看过”或用于个性化推荐。
46. 用户热门搜索词
分析用户需求,优化搜索和推荐。
47. 流量来源分析
评估哪些广告渠道带来流量和转化。
48. 按用户分组的留存分析
评估用户忠诚度和复购的关键指标。
49. 首页新闻/文章
博客新闻和文章,提高用户参与度。
50. 活跃页面及相关内容区块
检查网站内容完整性、CMS运行和页面数据展示。
加索引
查询写得再好,慢也没用。所以你得给主要表加40个索引,提升查询性能和运维体验。
1. product.product(status)索引
几乎所有商品查询都按status过滤(比如橱窗、搜索等)。索引能加速按状态查商品,减少全表扫描。
2. product.variant(product_id, is_active)索引
SKU和橱窗查询都按商品和激活状态过滤。这个复合索引能高效查出某商品的所有激活SKU。
3. product.image(product_id, is_main DESC)索引
获取主图或全部图片时,按商品和“主图”排序。索引能加速图片查询,提升画廊加载速度。
4. product.product(name text_pattern_ops)索引
按名字关键词搜索(ILIKE '%...%')时用。name text_pattern_ops专用索引能提升大表模糊搜索效率。
5. product.product(description gin_trgm_ops)索引
同上——按描述模糊或全文搜索。GIN三元组索引能加速文本字段过滤。
6. product.product(category_id)索引
经常按分类或子分类查商品。索引能快速找到指定分类下的所有商品。
7. product.category(parent_id)索引
构建分类树和导航时常按parent_id查。索引能加速递归层级查询。
8. product.review(product_id)索引
所有商品评论都按product_id过滤(平均分、评论列表等)。索引能大幅加速评论聚合和查询。
9. product.review(product_id, created_at DESC)索引
获取商品最新评论(ORDER BY createdat DESC),配合productid过滤时,复合索引很有用。
10. product.question(product_id, created_at DESC)索引
按商品查问答,按创建时间排序。索引覆盖两个条件,加速商品Q&A展示。
11. product.answer(question_id, created_at)索引
查商品问答时,按question_id和时间排序。索引能减少Q&A生成延迟。
12. product.price_history(variant_id, changed_at DESC)索引
按SKU和最近变动查价格历史。索引能加速价格动态分析和“原价/现价”查询。
13. product.status_history(product_id, changed_at DESC)索引
按商品查状态变更历史并按时间排序,常用于审计和生命周期管理。复合索引能大幅加速。
14. product.certificate(product_id)索引
按商品id查证书——B2B和认证橱窗常用。索引能加速验证。
15. product.license(product_id)索引
按商品查许可证,尤其是按许可证类型过滤时。
16. product.product_tag(tag_id)索引
常用查询——按标签查商品(或反查)。索引能高效交叉商品和标签,用于标签云或过滤。
17. product.product_tag(product_id)索引
快速查某商品绑定了哪些标签,加速标签筛选。
18. logistics.inventory(product_id, warehouse_id)索引
实时查商品在某仓库的库存(或所有仓库),对物流、库存检查和实时橱窗很关键。
19. logistics.inventory(variant_id)索引
按SKU查库存,用于SKU维度的报表。
20. logistics.stock_level(product_id, warehouse_id)索引
快速检查商品在仓库的最低库存(比如自动补货或低库存预警)。
21. logistics.inventory_movement(product_id, changed_at DESC)索引
快速查商品最近的库存流转历史——防错、损耗分析和供应链管理。
22. logistics.transfer(product_id, requested_at DESC)索引
分析仓库间调拨,按商品和申请时间过滤。
23. logistics.shipping_rate(shipping_method_id, destination_zone)索引
结算运费时,常按配送方式和目的地查。索引能加速下单时的运费计算。
24. "order".order(user_id, placed_at DESC)索引
用户订单历史都按user_id和下单时间查。复合索引能加速个人中心订单展示。
25. "order".order(status, placed_at)索引
订单报表和分析,按时间和状态(比如“处理中”/“已完成”)查。
26. "order".order_item(order_id)索引
按订单id查所有商品项——订单详情最常用的操作。
27. "order".order_item(product_id)索引
销售分析和商品统计,按商品id查订单项。
28. "order".return(order_id)索引
退货和订单关联,用于客服和退货分析。索引能加速按订单查退货。
29. "order".cancellation(order_id)索引
同退货——加速订单取消分析和客服处理。
30. "order".cart(user_id, updated_at DESC)索引
查用户最近的购物车(比如“遗弃”购物车),按user_id和更新时间排序。
31. payment.payment_transaction(order_id)索引
支付历史查询大多按订单过滤。索引能瞬间查到订单的所有交易。
32. payment.refund(transaction_id)索引
按交易查退款,用于客服、报表和防欺诈。
33. payment.wallet(user_id)索引
快速查用户钱包余额和操作历史。
34. payment.wallet_transaction(wallet_id, created_at DESC)索引
按钱包查交易并按时间排序(比如展示操作历史)。
35. support.support_ticket(user_id, created_at DESC)索引
查用户的客服工单历史(个人中心/客服)。复合索引能优化查询。
36. support.ticket_message(ticket_id, sent_at)索引
查工单所有消息,按工单和时间排序,加速消息展示。
37. support.ticket_sla_tracking(ticket_id)索引
SLA分析和工单管理,按ticket_id查SLA数据。
38. marketing.promo_usage(user_id, used_at DESC)索引
分析用户优惠码使用(分析和防滥用),按user_id和时间查。
39. analytics.product_view(user_id, viewed_at DESC)索引
存储和分析用户商品浏览历史(个性化、推荐),按user_id和浏览时间查。
40. analytics.search_query_log(query_text)索引
热门搜索词和使用频率——搜索分析的核心。索引能加速按搜索词聚合和统计。
说明
模糊搜索(ILIKE)推荐用pg_trgm扩展的GIN索引,适合子串和模糊查找。大表按日期聚合或排序建议用日期DESC索引——能加速查最新记录。
实际索引应结合执行计划和负载统计调整,但上面这些索引已覆盖我们电商平台的主要生产场景。
加函数
还没累吧?那我们再写几个函数,让现有和未来的查询更好写。这样能加速关键查询实现,减少代码重复,把业务逻辑集中到数据库里。
1. 支持标签和品牌的商品关键词搜索
为什么要用:
只按名字和描述搜不够,经常还要按标签和品牌搜。通用函数能集中扩展搜索逻辑,减少代码重复,前端集成也更简单。
2. 根据ID获取完整商品卡片(所有详情)
为什么要用:
前端经常一次性要拿到商品所有信息:主字段、品牌、分类、图片、标签、属性、平均分和评论数。函数一次性组装完整卡片,减少数据库请求。
3. 获取带嵌套的分类树
为什么要用:
橱窗、过滤和面包屑都要分类树。函数能一次性返回完整层级,省去前端递归查询。
4. 按分类统计平均价、最小/最大价
为什么要用:
目录过滤和分析时,方便拿到分类下商品的价格区间和均值。函数能省去重复子查询。
5. 自动统计所有仓库商品库存
为什么要用:
能瞬间查出商品总库存(和每个SKU),对橱窗、仓库和物流都很有用。集中计算,避免业务逻辑重复。
6. 获取用户订单历史及详情
为什么要用:
函数返回用户订单列表,包括商品项、金额、状态,让前端一次性拿到所有数据,直接渲染个人中心。
7. 获取用户作为卖家/买家的平均评分
为什么要用:
展示用户在平台的信任度和口碑,函数能聚合计算平均分。
8. 用户使用优惠码(带所有校验)
为什么要用:
所有优惠码校验和扣减逻辑(激活、限额、日期等)都集中在一个函数里。这样应用逻辑更简单,也防止条件重复出错。
9. 通用用户事件日志函数
为什么要用:
做全链路分析和审计时,集中日志能减少代码重复,也降低用户行为数据丢失风险。
10. 获取奖励钱包余额和累计奖励
为什么要用:
一次性拿到当前余额和累计奖励,方便仪表盘展示,也减少SQL请求数。
11. 通用订单状态变更并日志函数
为什么要用:
变更订单状态时自动写入状态历史日志,减少多处代码出错风险。
12. 获取客服工单所有消息(工单+消息)
为什么要用:
函数返回工单全部对话,包括工单详情和每条消息,方便前端渲染工单历史。
13. 按email或手机号查用户是否存在
为什么要用:
注册和找回密码时用,避免前后端逻辑重复。
说明
这套函数覆盖了主要业务场景,提升数据操作体验,优化逻辑,加快前端和集成开发。希望你喜欢 :)
包含解决方案的文件
GO TO FULL VERSION