6

我正在编写一些代码来在数据库中查找重复的客户详细信息。我将使用 Levenshtein 距离。

但是,我不确定如何存储关系。我一直在使用数据库,但从未遇到过这种情况,我想知道是否有人可以为我指明正确的方向。

令我困惑的是如何存储关系的双向性质。

我已经开始在下面放置一些示例,但想知道是否有存储此类数据的最佳实践,

示例数据

身份证、地址

001, 5 Main Street
002, 5 Main St.
003, 5 Main Str
004, 6 High Street
005, 7 Low Street
006, 7 Low St

建议一

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

建议二

客户 ID、分组
ID
001、1
002、1
003、1
005、2 006、2

4

3 回答 3

8

在关系系统中处理对称关系的方法如下:

  • 选择存储对称对的规范形式,例如 customer_id1 < customer_id2。
  • 将视图 SYMM_TBL 定义为 select id1,id2,... from ... UNION select id2 as id1,id1 as id2, ... FROM ...

当查询这个视图时,体面的系统不应该在性能方面惩罚你。

于 2010-09-17T14:51:41.780 回答
6

我们这里有一个图,其中每个节点与每个其他节点都有关系(编辑距离)。这不在数据模型的正常范围内。它也不是您的数据库的永久功能(假设您解决了导致重复数据的业务流程),因此不值得为最适合关系理论的解决方案出汗。我们需要的是一个切实可行的解决方案。

把它想象成一个矩阵。如果我们进行最佳处理,我们将不会执行重复评分。因此,我们针对所有其他地址对地址 1 进行评分,针对除地址 1 之外的所有其他地址对地址 2 进行评分,针对除地址 1 和 2 之外的所有其他地址对地址 3 进行评分,等等。我们最终得到的是一点就像足球联赛表:

          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
/
于 2010-09-17T10:35:25.880 回答
1

与往常一样,这取决于您在计算完数据后要对数据做什么。

假设它只是简单地识别或定位重复项,那么您的建议 1 就是我要使用的,即第二个表,它只存储对和强度。我唯一的建议是使强度成为比例整数而不是小数。

于 2010-09-17T08:35:45.383 回答