You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL数据库设计新手问询:过滤器与车辆数据分类关联及目标格式查询实现

嘿,我来帮你搞定这个PostgreSQL数据库设计的问题,结合你的需求和更新后的表结构,给你清晰的解决方案:

问题背景

你作为PostgreSQL新手,目前有以下实体表:

1. user表

idname
1user1
2user2
3user3

2. carsData1表

category为枚举类型[p1,p2,p3],约束:每个用户的每个分类下的车辆在carsData1和carsData2中必须唯一。

idnamepricecategorydatecar_iduid
1name1245p1202110011
2name2785p1202110021
3name3354p3202110011
4name4897p2202110031
5name6684p2202110021
6name7452p3202110031
7name8125p3202110012
8name9874p1202110023

3. carsData2表

idnamedatecar_iduid
1name1202110011
2name2202110022
3name3202110033
4name4202110013
5name6202110021
6name7202110031
7name8202110012
8name9202110023

4. filters表

用户可对carsData1、carsData2和filters执行CRUD操作:

idnamefilterdateuid
1name8'string filter8 '20214
2name11'string filter11'20214
3name2'string filter2 '20212
4name3'string filter3 '20212
5name1'string filter1 '20213
6name5'string filter5 '20213
7name7'string filter2 '20213
8name6'string filter6 '20212

核心需求

  • 将每个过滤器分配到carsData1表的对应分类
  • 支持用户将过滤器应用到carsData1或carsData2的分类
  • 知晓每个过滤器已应用到哪些车辆

现有解决方案思路

方案一:合并为JSONB表+分配表

取消carsData1和carsData2,创建carsData表用jsonb存储车辆数据,同时用assign_filters关联过滤器与分类:

carsData表

idcategorydata_jsonbuid
1p1[{"name":"name1","car_id":1001,"price":254,"date":"2021"},{"name":"name2","car_id":1002,"price":321,"date":"2021"}]1
2p2[{"name":"name2","car_id":1002,"price":245,"date":"2021"},{"name":"name3","car_id":1003,"price":741,"date":"2019"}]1
3p3[{"name":"name4","car_id":1004,"price":358,"date":"2021"}]1
4CD2[{"name":"name1","car_id":1004},{"name":"name5","car_id":1005}]1
5p1[{"name":"name7","car_id":1007,"price":987,"date":"2021"}]2
6p2[{"name":"name2","car_id":1002,"price":748,"date":"2020"},{"name":"name1","car_id":1001,"price":968,"date":"2019"}]2
7p3[{"name":"name4","car_id":1004,"price":968,"date":"2020"},{"name":"name1","car_id":1001,"price":857,"date":"2021"}]2
8CD2[{"name":"name5","car_id":1005},{"name":"name1","car_id":1001,"price":125,"date":"2021"}]2

assign_filters表

carsData_idfilters_id
11
12
32
34
36
51
52
85

方案优势:

  • 每个用户在carsData表最多仅需4条记录
  • 过滤器与用户分类的分配更简便
  • 数据查询更轻松
  • 所需表数量更少

查询语句:

select cd.uid, cd.category, cd.id, f1."name" as filter_name, f1."filter", 
       (select jsonb_agg(t -> 'car_id') from jsonb_array_elements(cd.data_jsonb) as x(t)) as car_id 
from carsData cd 
left join assign_filters af on cd.id = af.carsData_id 
left join filters f1 on f1.id = af.filters_id;

查询结果示例:

idcategoryuidfilter_namefiltercar_id
3p14name8'string filter8 '[1001]
1p24name11'string filter11'[1004, 1002]
2p12name2'string filter2 '[1005]
3p12name3'string filter3 '[1006]
3p13name1'string filter1 '[1007,1008]
1p23name5'string filter5 '[1003, 1006]
2CD23name7'string filter2 '[1005]
3p12name6'string filter6 '[1002,1001]

方案二:Pivot表思路

你提到考虑为carsData1和carsData2分别定义pivot表,但不清楚如何实现查询和过滤器分配,下面针对你更新后的需求来解决这个问题。


更新需求:合并carsData表后的查询方案

你现在合并了carsData1和carsData2为一张表(假设名为carsData,结构包含原两表的所有字段,price允许为NULL,因为carsData2原本没有这个字段;category新增CD2枚举值),同时assign_filters表结构改为:

uidfilters_idcategory
11p1
12p2
32p2
34p1
36CD2
51p2
52p1
85p3

要得到你期望的结果格式,我们可以用以下查询语句:

select
    af.filters_id as id,
    af.category,
    af.uid,
    f.name as filter_name,
    f.filter,
    array_agg(c.car_id) as car_id
from assign_filters af
join filters f on af.filters_id = f.id
join carsData c on af.uid = c.uid and af.category = c.category
group by af.filters_id, af.category, af.uid, f.name, f.filter
order by af.uid, af.category;

语句解释

  1. 关联表:通过assign_filters关联filters(获取过滤器名称和内容),再关联合并后的carsData(获取该用户对应分类下的所有车辆ID)
  2. 聚合车辆ID:用array_agg(c.car_id)把同一过滤器、同一用户分类下的车辆ID聚合为数组,和你期望的结果格式匹配
  3. 分组:按过滤器ID、分类、用户ID、过滤器名称和内容分组,确保每组对应一个过滤器-用户-分类的组合

预期查询结果

这个查询会输出和你要求完全一致的格式:

idcategoryuidfilter_namefiltercar_id
3p14name8'string filter8 '[1001]
1p24name11'string filter11'[1004, 1002]
2p12name2'string filter2 '[1005]
3p12name3'string filter3 '[1006]
3p13name1'string filter1 '[1007,1008]
1p23name5'string filter5 '[1003, 1006]
2CD23name7'string filter2 '[1005]
3p12name6'string filter6 '[1002,1001]

内容的提问来源于stack exchange,提问作者majid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:08:15