我正在编写一些代码来查找数据库中重复的客户详细信息。我将使用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 lt
答案 0 :(得分:7)
处理关系系统中对称关系的方法如下:
在查询此视图时,体面系统不应该惩罚你。
答案 1 :(得分:6)
我们这里有一个图表,其中每个节点与每个其他节点有一个关系(编辑距离)。这不在正常的数据模型范围内。它也不是数据库的永久特性(假设您解决导致重复数据的业务流程),因此不值得为最适合关系理论的解决方案而汗流。背。我们需要的是一个实用的解决方案。
将其视为矩阵。如果我们进行最佳处理,我们将不执行重复的评分。所以我们对所有其他地址得分地址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 - - - - -
此数据最好存储在建议1中,即ID1, ID2, SCORE
表。虽然我们确实需要转动数据以使输出看起来像这样:)
在一张合适的排名表中,有两组得分 - 主场和客场 - 所以桌子是对称的。但这不适用于此,因为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 -
当然,这主要是一种表现形式的东西,所以它只需要用于显示目的,例如将数据导出到电子表格。我们仍然可以以可读的方式获得地址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
/
答案 2 :(得分:1)
一如既往,这取决于您在计算数据后想要对数据做些什么。
假设它只是识别或找到重复项,那么你的建议1就是我使用的,即第二个表只存储对和强度。我唯一的建议是使强度为缩放整数而不是小数。