Java实现相似结构表算法
2021-03-29 06:25
标签:service dsl tco 查找 sel 关系 逗号 list ret 【产品需求】 对所有元数据进行分析,匹配出表字段相似度达到阈值的向相似结构表关系数据。 网上没有搜到相关算法实现,只能自己动手了。 【算法实现】 简单点实现的话,可以轮询所有表,每张表都和其它表进行匹配相似度,不过这是人干的事?如果有1W张表岂不要查询1W × 9999次? 1、先统计出相同字段、表、表字段数量,其中相同字段对应的多个表和表字段数量通过行合并成字符串用逗号分隔,BXX:表信息、BZD:表字段信息,查询SQL脚本和查询结果如下:
2、现在已经知道了相同字段和表之间的联系 我们来分析一下,统计出来的一条数据,代表某个字段在多个表同时存在,表和表之间构成了一次相同字段 后面我们只需要把所有数据通过算法计算一边,计算统计数据中表和表之间两两存在相同字段的数量,并和表本身的字段数量比较,达到相似结构表阈值的两张表即互为相似结构表 具体算法如下: Java实现相似结构表算法 标签:service dsl tco 查找 sel 关系 逗号 list ret 原文地址:https://www.cnblogs.com/changxy-codest/p/13615565.htmlSELECT
*
FROM (
SELECT BZD.ZDYWM, BZD.ZDZWM, BZD.ZDLX, count(1) AS "same", GROUP_CONCAT(BZD.B_ID) AS "bIds", GROUP_CONCAT(BXX.ZDSL) AS "zdsl"
FROM BZD LEFT JOIN BXX ON BZD.B_ID = BXX.ID
WHERE BXX.SFSC = ‘N‘ AND BZD.SFSC = ‘N‘
GROUP BY BZD.ZDYWM, BZD.ZDZWM, BZD.ZDLX
) _ALL
WHERE SAME > 1
/**
* 相似结构表数据计算写入
* 实现思路:
* 1、group by字段信息表,查询存在重复的字段及表Id、表字段数量;
* 2、查询出的一条数据代表某一字段多个表都存在;
* 3、循环所有数据找出表和表之间存在相同字段的数量累加,数据结构如下;
* -------------------------------------------------------------
* 本表 本表字段数量 -> 可能存在相似结构的表1 相同字段数量
* 可能存在相似结构的表2 相同字段数量
* 可能存在相似结构的表3 相同字段数量
* 可能存在相似结构的表4 相同字段数量
* -------------------------------------------------------------
* 4、根据阈值计算符合相似结构表之间的关系;
*/
@Override
public void insert() {
// 查询存在重复字段的表信息
// --------------------------------------------------------------------------------
// 字段英文名、字段中文名、字段类型、bId1,bId2,bId3,bId4、bzdsl1,bzdsl2,bzdsl3,bzdsl4
// --------------------------------------------------------------------------------
List
public class XsjgGxbxx implements Serializable {
private static final long serialVersionUID = -8772273934672363080L;
/**
* 可能存在相似结构的表Id
*/
private String xsbId;
/**
* 相似字段数量
*/
private Integer xszdsl;
public XsjgGxbxx(String xsbId) {
this.xsbId = xsbId;
this.xszdsl = new Integer(1);
}
public void increment() {
this.xszdsl += 1;
}
}
public class Xsjgb extends EntityBean {
@Transient
private static final long serialVersionUID = 1L;
/**
* 表Id
*/private String bId;
/**
* 数据包标识 (可作为表名的组成部分)
*/private String xsjgbId;
public Xsjgb(@NotEmpty String bId, @NotEmpty String xsjgbId) {
this.bId = bId;
this.xsjgbId = xsjgbId;
}
}
public class Xsjgbxx implements Serializable {
private static final long serialVersionUID = -6162813536053634882L;
/**
* 表Id
*/
private String bId;
/**
* 表字段数量
*/
private Integer zdsl;
/**
* 可能存在相似结构的表
*/
private List
public class XsjgbzdxxDTO implements Serializable {
private static final long serialVersionUID = 8209530764411503009L;
/**
* 字段英文名
*/
private String zdywm;
/**
* 字段中文名
*/
private String zdzwm;
/**
* 字段类型
*/
private String zdlx;
/**
* 相同字段的表Id,英文逗号分隔
*/
private String bIds;
/**
* 相同字段的表字段数量,英文逗号分隔
*/
private String zdsl;
}
下一篇:Java程序基础