如何设计支持if-else-then条件的路由规则数据库架构?
问卷路由规则的数据库设计方案与实现思路
一、关联现有模型的数据库表设计
基于你已有的routes(路由链接表)和question(问卷问题表),新增以下3张核心表来存储路由规则:
1. rule_definitions(规则主表)
存储每个路由规则的基础信息,关联目标路由:
| 字段名 | 类型 | 说明 |
|---|---|---|
| rule_id | 主键(INT) | 规则唯一ID |
| route_id | 外键(INT) | 关联routes表,指向该规则匹配后要跳转的链接 |
| rule_priority | INT | 规则优先级(数值越小优先级越高,解决多规则匹配冲突) |
| rule_description | VARCHAR(255) | 规则描述(方便维护,比如"年龄20-40跳转A链接") |
2. rule_conditions(规则条件表)
存储每个规则下的具体判断条件,关联对应的问卷问题:
| 字段名 | 类型 | 说明 |
|---|---|---|
| condition_id | 主键(INT) | 条件唯一ID |
| rule_id | 外键(INT) | 关联rule_definitions表,属于哪个规则 |
| question_id | 外键(INT) | 关联question表,指向要判断的问卷问题 |
| operator | VARCHAR(20) | 判断操作符,支持EQ(等于)、IN(包含在集合)、CONTAINS(包含)等 |
| target_value | TEXT | 目标值,比如"a,b"(对应IN操作符)、"c"(对应EQ)、"kevin"(对应CONTAINS) |
| logic_type | VARCHAR(10) | 同规则下多条件的逻辑关系:AND(且)、OR(或) |
3. rule_condition_groups(可选,条件组表)
如果规则需要复杂的逻辑组合(比如(条件1 OR 条件2) AND 条件3),可以新增这张表来分组管理条件:
| 字段名 | 类型 | 说明 |
|---|---|---|
| group_id | 主键(INT) | 条件组唯一ID |
| rule_id | 外键(INT) | 关联rule_definitions表 |
| group_logic | VARCHAR(10) | 组之间的逻辑关系:AND/OR |
二、示例场景的表数据填充
对应你给出的示例,填充后的数据如下:
routes表(已有)
| route_id | link_url | route_name |
|---|---|---|
| 1 | A Link | 链接A |
| 2 | B Link | 链接B |
question表(已有)
| question_id | question_content |
|---|---|
| 1 | 您的年龄范围? |
| 2 | 您的姓名? |
rule_definitions表
| rule_id | route_id | rule_priority | rule_description |
|---|---|---|---|
| 1 | 1 | 1 | 年龄选20-30或30-40,跳转链接A |
| 2 | 2 | 2 | 年龄选40-50且姓名含kevin,跳转链接B |
rule_conditions表
| condition_id | rule_id | question_id | operator | target_value | logic_type |
|---|---|---|---|---|---|
| 1 | 1 | 1 | IN | "a,b" | OR |
| 2 | 2 | 1 | EQ | "c" | AND |
| 3 | 2 | 2 | CONTAINS | "kevin" | AND |
三、规则匹配逻辑实现
用户提交问卷答案后,按以下步骤执行路由匹配:
- 按
rule_priority升序(优先级从高到低)遍历所有规则 - 对每个规则,检查其下所有条件是否满足:
- 若规则只有单个条件:直接判断用户答案与
target_value是否符合operator定义的逻辑 - 若规则有多个条件:根据
logic_type(AND/OR)组合判断所有条件是否同时/任一满足
- 若规则只有单个条件:直接判断用户答案与
- 找到第一个满足条件的规则,跳转至其关联的
link_url
四、其他可行思路
1. 规则脚本化存储
如果规则逻辑非常复杂(比如包含计算、多维度嵌套判断),可以在rule_definitions中新增rule_script字段,存储可执行的脚本片段(比如Python表达式、Groovy脚本),用户提交答案后动态执行脚本判断是否匹配。
注意:需做好脚本安全校验,避免注入风险。
2. 规则引擎集成
如果系统后续需要大量复杂规则,可集成成熟的规则引擎(如Drools、Easy Rules),将规则配置在引擎中,数据库仅存储规则的元数据和关联路由信息。
内容的提问来源于stack exchange,提问作者destiny1616
相关产品推荐
相关产品推荐

