如何存储双向关系

6
我正在编写一些代码来在数据库中查找重复的客户信息。我将使用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
3个回答

8

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

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

良好的系统不应该在查询此视图时影响性能。


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中,建议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     -

当然,这主要是为了呈现效果而进行的操作,因此只需要用于显示目的,例如将数据导出到电子表格中。我们仍然可以通过简单的SQL语句以可读的方式获取所有地址5的分数,而不需要使用镜像分数的方法:

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
/

感谢APC,该矩阵很有意义,帮助可视化。那个SQL语句也非常实用。谢谢。 - alj

1

像往常一样,这取决于您计算完数据后想要用它做什么。

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


我需要将数据呈现给维护它的人员,以便他们可以查看并检查它。在这方面,我想我的第一个建议就足够了。但是我想知道是否有一种“标准”方式来存储这样的信息,这样我就可以根据他们的要求将其输出到各种格式中(因为他们无疑会回来说他们希望用另一种方式完成!) 另外...这是一个很好的机会来提高我对数据库模式的理解。 - alj
这是我一直以来的做法。有时候,最简单的解决方案就能奏效,我们不需要寻求更复杂的东西。第一个解决方案将会奏效,并且足够高效,能够产生你所需的结果。 - Richard Harrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接