alj*_*alj 6 database database-design deduplication data-structures
我正在编写一些代码来查找数据库中重复的客户详细信息.我将使用Levenshtein距离.
但是,我不确定如何存储关系.我一直在使用数据库,但从未遇到过这种情况,并想知道是否有人可以指出我正确的方向.
令我困惑的是如何存储关系的双向性质.
我已经开始在下面提供一些示例,但想知道是否存在存储此类数据的最佳实践,
示例数据
id,地址
001,5 Main Street
002,5 Main St.
003,5 Main Str
004,6 High Street
005,7 Low Street
006,7 Low St
建议1
customer_id1,customer_id2,relationship_strength
001,002 0.74
001,003,0.77
002,003,0.76
005,006,0.77
对这种方法不满意,因为它推断出customer_id1与customer_id2之间的单向关系.当然,除非我双向包含所有关系,但这会使处理时间和表的大小加倍.
例如,需要包括:002,001,0.74
建议2
CUSTOMER_ID,GROUPING_ID
001,1
002,1
003,1
005,2
006,2
在关系系统中处理对称关系的方法如下:
在查询此视图时,体面系统不应该在性能区域惩罚您.
我们这里有一个图表,其中每个节点与每个其他节点有一个关系(编辑距离).这不在正常的数据模型范围内.它也不是数据库的永久特性(假设您解决导致重复数据的业务流程),因此不值得为最适合关系理论的解决方案而汗流.背.我们需要的是一个实用的解决方案.
把它想象成一个矩阵.如果我们进行最佳处理,我们将不执行重复的评分.所以我们对所有其他地址得分地址1,我们对地址2除了地址1以外的所有其他地址得分,我们对地址3除了地址1和2以外的所有其他地址等等.我们最终得到的是一点像一个足球联赛表:
addr
1 2 3 4 5
addr
1 - 95 95 80 76
2 - - 100 75 72
3 - - - 75 72
4 - - - - 83
5 - - - - -
Run Code Online (Sandbox Code Playgroud)
这些数据最好存储在建议1,表格中ID1, ID2, SCORE.虽然我们确实需要透视数据以使输出看起来像:)
在一个合适的联赛表中,有两组得分 - Home和Away - 所以桌子是对称的.但这不适用于此,因为编辑距离1 > 2是相同的2 > 1.但是,如果结果集包含镜像分数,它将使查询结果更直接.也就是说,对于记录(1,5,76),(2,5,72)等我们生成的记录(5,1,76),(5,2,72).这可以在评分过程结束时完成.
addr
1 2 3 4 5
addr
1 - 95 95 80 76
2 95 - 100 75 72
3 95 100 - 75 72
4 80 75 75 - 83
5 76 72 72 83 -
Run Code Online (Sandbox Code Playgroud)
当然,这主要是表示性的东西,因此只需要进行显示,例如将数据导出到电子表格.我们仍然可以以可读的方式获得地址5的所有分数,而不使用简单的SQL语句来评分分数:
select case when id1 = 5 then id1 else id2 end as id1
, case when id1 = 5 then id2 else id1 end as id2
, score
from your_table
where id1 = 5
or id2 = 5
/
Run Code Online (Sandbox Code Playgroud)