我在一个管理人力资源的系统中工作,它有一个BI(业务智能(部分,用于从主系统收集和处理数据,然后将处理后的数据可视化为图表,表格等。
例如,我们希望看到人员年龄 [在 18 - 38 范围内](在轴 1 中(和他们的月薪(在轴 2 中([在完整工资范围内]之间的关系。聚合值是亲自计数的。还有一个称为"筛选器"的附加步骤,用于仅在组织 A 中筛选结果。
预期结果是这样的:
Age_18<28 Age_28<38 Age_38<48
Salary_<1000 12 25 45
Salary_1000<5000 12 10 2
Salary_>5000 1 1 2
目前的处理步骤如下:
- 搜索 axis1:搜索组织 A 中年龄范围为 [18-38] 的所有人员 搜索
- 轴 2:搜索组织 A 中的所有人员
- 合并轴 1 和轴 2 的结果
- 计算每个条件的人数,例如,具有 Age_18<28 和 Salary_<1000 的人数为 12,依此类推。
- 转换为 json 响应
因为有很多情况需要处理,所以逻辑变得难以维护。所有步骤都像上面一样手动处理。
所以我只是想知道这是否是一个常见问题,应该有一个通用的处理方式,例如设计模式、算法、库 (Java( 或特定概念来处理我以前从未知道的事情。
目标: - 使代码更简单、可读和可维护 - 易于扩展,即添加新案例
我将要尝试的: - 应用责任链+战略模式 - 只是想知道阿帕奇卡夫卡是否是正确的方式
注意:以上只是一个非常简单的情况,它可能在 1 轴中包含多个项目,并带有一些附加条件
一种思考方式是,您在 3 x 3 频率表中累积计数。
编写一个简单的方法来将薪水映射到索引,如下所示:
< 1000 => 0 1000 to < 5000 => 1 >= 5000 => 2
有多种方法可以对此方法进行编码。
编写一个简单的方法来将年龄映射到索引,如下所示:
18 to < 28 => 0 28 to < 38 => 1 38 to < 48 => 2
像这样放在一起:
int counts[][] = new int[3][3]; for each person: p in ... counts[ageIndex(p.age)]][salaryIndex(p.salary)] += 1;
你可以很容易地在Java中实现它,也可能在SQL或BI系统的查询语言中实现它......如果有的话。
您可以将其推广到 M x M 和更多维度。 如果您为此付出一些努力,您实际上可以将映射实现为数据驱动的函数;例如
public int mapToIndex(int value, int[] ranges) { ... }
请注意,您正在做的事情存在缺陷。 员工年龄可能小于 18 岁或超过 48 岁。