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

支持通知源通用过滤规则的数据库设计方案咨询

数据库模型设计方案

核心设计思路:通过预先定义全局元数据做约束,既保证参照完整性,又能支持任意维度的自定义过滤条件配置,无需额外适配多对多关联逻辑。

1. 基础元数据表(全局预先维护,内置约束)

所有可配置的通知类型、过滤字段、操作符都提前固化到元数据表,从根源避免非法配置:

  • notification_type 表:存储所有合法通知类型元数据
    字段:id(主键)、type_name(通知类型名称,如「任务创建」)、source_entity(关联的业务实体,如Task/Order)
  • filterable_field 表:存储每个业务实体下允许用于过滤的字段元数据
    字段:id(主键)、entity_type(所属业务实体,如Task/Order)、field_name(字段名,如tags/status/price)、field_type(字段类型,如字符串/数字/枚举/数组)
  • operator 表:存储支持的过滤操作符元数据
    字段:id(主键)、op_symbol(操作符标识,如eq/contains/in/gt)、op_desc(操作符说明,如等于/包含/属于/大于)、support_field_type(支持匹配的字段类型,可关联filterable_field的field_type做校验约束)

2. 用户订阅业务表

所有外键直接关联元数据表,天然保证参照完整性:

  • user_subscription 表:用户订阅主表,关联用户和其订阅的通知类型
    字段:id(主键)、user_id(订阅用户ID,外键关联用户表)、notification_type_id(订阅的通知类型ID,外键关联notification_type表)、is_enabled(订阅是否生效)
  • subscription_filter 表:存储单个订阅下的所有过滤条件,多条件默认按AND逻辑匹配,需要OR逻辑可额外加group_id字段分组
    字段:id(主键)、subscription_id(关联订阅主表ID,外键关联user_subscription表)、filterable_field_id(过滤字段ID,外键关联filterable_field表)、operator_id(匹配操作符ID,外键关联operator表)、filter_value(过滤匹配值,统一用字符串存储,匹配时按字段类型转换即可)

3. 场景配置示例

对应你提到的三个需求场景,配置逻辑如下:

  1. 接收带指定标签的任务创建通知
    • user_subscription新增记录:user_id=当前用户ID、notification_type_id=「任务创建」对应的元数据ID、is_enabled=1
    • subscription_filter新增记录:subscription_id=上述订阅ID、filterable_field_id=Task实体tags字段对应的元数据ID、operator_id=「包含」操作符对应的ID、filter_value="指定标签值"
  2. 接收状态变更为"closed"的任务变更通知
    • user_subscription新增记录:user_id=当前用户ID、notification_type_id=「任务变更」对应的元数据ID、is_enabled=1
    • subscription_filter新增记录:subscription_id=上述订阅ID、filterable_field_id=Task实体status字段对应的元数据ID、operator_id=「等于」操作符对应的ID、filter_value="closed"
  3. 接收价格为"100.000"的订单创建通知
    • user_subscription新增记录:user_id=当前用户ID、notification_type_id=「订单创建」对应的元数据ID、is_enabled=1
    • subscription_filter新增记录:subscription_id=上述订阅ID、filterable_field_id=Order实体price字段对应的元数据ID、operator_id=「等于」操作符对应的ID、filter_value="100.000"

4. 通知匹配逻辑

触发新通知时,先拿到通知对应的业务实体、通知类型,拉取所有订阅了该通知类型的生效订阅,再逐个匹配过滤条件:
提前把通知关联的所有属性(包括多对多关联的标签、关联人等属性)拉取到当前实体的属性集合中,按照过滤条件里的字段类型、操作符和配置的filter_value做匹配,所有条件都匹配的用户即可推送该通知。如果后续需要新增过滤维度,只需要在filterable_field表新增对应字段元数据即可,无需修改表结构。

内容的提问来源于stack exchange,提问作者Just van der Veeken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:39:03