【Demo案例】多表关联/嵌套:购买了相同产品的客户

任务

使用集算器作为java的计算层,求:哪些客户购买了相同的指定产品?

数据库中有2张表, 部分数据如下:

常规的解决思路如下:

  • 1. 将AllOrders table 按照Customer_id分组
  • 2. 取得item_id的集合
  • 3. 除去重复的成员
  • 4. 最后按照指定的item列表过滤,即可获得所求目标

如图所示:

步骤

  1. 取数据
    直接书写SQL,从各表取出数据
    点击每个单元格可以直观地看到对应的计算结果,比如A2中的AllOrders
    定义外部参数:指定的产品列表

  2. 分组
    下面将A2按照customer_id分组
    在A3中引用A2的计算结果
    customer_id是分组依据,命名为customer


    ”~”表示每组的成员

    蓝色字体表示这个成员是一个集合,点击可以看到该集合的下级成员

    这是A3的第一个成员中的”OrderList”字段所包含的成员。
    显然,分组的结果是集合,集合的成员可以是另一个集合。集合可以方便的对分组后的数据进行加工。
  3. 对象引用
    A4:将这些item_id取出形成新列:ItemList


    通过对象引用的方式,集算器可以轻松访问多级集合的成员

    A5:过滤重复值
    从而得到客户1购买过的不重复的item

    A3-A5是分步的计算,即将计算目标尽可能细化。
    这样的好处是可以将复杂的计算目标简化为多个简单的步骤:

    1. 循序渐进
    2. 直观的观察再加工
    3. 减少bug的可能性
    也可以像B3这样一步写出,B3等价于A3-A5
    这样的好处是代码更短更敏捷

    B6:引用外部参数并过滤出符合条件的客户


    通过对象引用,集算器轻松实现了计算目标.
    在Java或报表工具中可以通过JDBC调用这一计算结果。

  4. 多表关联
    如果用SQL进一步计算B6中的客户帐户余额的平均值,就会涉及到多表和嵌套的关联计算
    集算器的对象引用可以避免这种复杂的算法

    在A3插入一行,建立对象引用

    这表示用A2中的customer_id字段引用A1中对应的记录。
    B7继承了这种引用关系

    B8:利用对象引用轻松算出B7中的平均值


    注意,移动单元格时,公式会智能变更而无须手工修改,比如A4\B4中的公式未变,A5\A6\B7中的公式自动变化

  5. 集合运算
    其他用户的帐户余额呢?即B4中去掉B7中的用户,他们的平均余额呢?
    如下图中的C9:“B4\B7”,这表示2个集合的“差集”


    集合运算可以直观解决这类问题,SQL没有集算器的显式集合,同样的运算要转化为复杂的多表关联查询。