如何存储双向关系

时间:2010-09-17 08:22:10

标签: database database-design data-structures deduplication

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

3 个答案:

答案 0 :(得分:7)

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

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

在查询此视图时,体面系统不应该惩罚你。

答案 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就是我使用的,即第二个表只存储对和强度。我唯一的建议是使强度为缩放整数而不是小数。