请教一个设计思路问题,要实现一个层级配置功能,
前置需求
有 1 个基础表简称 b (a, b, c, d, e)有很多列数据。现在需要依据这个配置做一个层级配置。
规则如下,使用 a, b, c 3 个列 做一个规则配置,
-
必须依次往下配置,a 必填,b 和 c 非必填。不会有(null, null, "x" )或 ("1", null ,"3")这样的数据,可以出现('a', null, null) 、(a, b, null) {a, b, null}这样数据
-
配置的数据项不能存在重复的级别配置,举例
-
如果存在("1", "2", "3"),那么任何("1" ,? , ?) 类型的都不可以(?包含 null ),只能是不同与现有数据级别的值,比如可以是("1","2","4")、("1","2","5")、("1","3","3")这样的数据
-
如果存在("1", "2", null),那么任何("1" , "2" , ?) 类型的都不可以(?包含 null ),只能是不同与现有数据级别的值,比如可以是("1","3",null)、("1","1",null)、("2","1", null)这样的数据
-
如果存在("1", null, null),那么任何("1" , ? , ?) 类型的都不可以(?包含 null ),只能是不同与现有数据级别的值,比如可以是("2",null, null)、("3", null, null) 、("4", "2", null 这样的数据
-
如果配置了 a=1 ,bc 为 null ,后面所有 a=1 后续无法再配置,只能再配置 a!=1 的。
-
如果配置了 a=2,b=3 ,后面所有 a=2 ,b=3 的后续无法再配置,只能再配置符合 非(a=2 且 b=3)的。
-
总和来说,就是 只能存在同级别不重复的数据,取决于谁先谁后,先配置了层级大小决定了后续能添加的维度大小。不存在交叉数据的维度。
目前想法
目前的想法,是数据库设计一个 b 如 t ( a,b,c ) 3 个字段
select CONCAT_WS('_',ifnull(a,''), ifnull(b,''), ifnull(c,'')) as uniqueKey from t where LOCATE(#{uniqueKey,jdbcType=VARCHAR}, t.uniqueKey) > 0 or LOCATE(t.uniqueKey, #{detail.uniqueKey,jdbcType=VARCHAR}) > 0 - 然后每次新增配置使用类似这样的判断,将几个配置拼接,然后传入要新增配置的 uniqueKey (也按照 sql 逻辑拼接传入)
- 然后判断是否相互包含,如果包含证明存在通用级别配置,
- 但是这样个问题就是,就是如果存在数据(1,null, null)对应 1__,传入(1,2,null)对应 1_2_,这样查询就不会包含。
- 尝试将拼接符号换位空白,CONCAT_WS('_' 这里替换成 CONCAT_WS('') ,这样使用包含可以临时解决这个问题,但是如果存在数据(1,2,2),传入(1,2,23)也会被认为是存在相同的数据,目前卡在这里了,
- 目前是 mysql 和 springboot ,大家有没有什么好的设计或方案呢,表的设计或其他判断逻辑方面的。
