【问题标题】:How to store bidirectional relationships如何存储双向关系
【发布时间】:2011-04-13 14:51:33
【问题描述】:

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

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

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

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

示例数据

身份证、地址

001, 5 大街
002, 5 Main St.
003, 5 主线
004, 6 大街
005, 7 低街
006, 7 低街

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

【问题讨论】:

    标签: database database-design data-structures deduplication


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      把它想象成一个矩阵。如果我们进行最佳处理,我们将不会执行重复评分。因此,我们针对所有其他地址对地址 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
      /
      

      【讨论】:

      • 感谢 APC。该矩阵有意义并有助于将其可视化。那条 SQL 语句也确实是手工的。谢谢。
      【解决方案3】:

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

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

      【讨论】:

      • 我需要将数据呈现给维护它的人,以便他们进行检查。所以在这方面,我想我的第一个建议就足够了。但我想知道是否有存储此类信息的“标准”方式,以便我可以灵活地将其输出为各种格式,具体取决于他们想要的内容(因为他们无疑会回来说他们希望以另一种方式完成! )。另外……这是一个提高我对数据库架构理解的好机会。
      • 这是我一直以来的做法。有时最简单的解决方案就行了,我们不需要寻求更复杂的解决方案。第一个解决方案将有效并且足够高效并产生您需要的结果。
      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 2016-12-05
      • 2014-07-23
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多