6

データベースで重複する顧客の詳細を見つけるためのコードを書いています。レーベンシュタイン距離を使用します。

ただし、関係を保存する方法がわかりません。私はいつもデータベースを使用していますが、このような状況に遭遇したことはなく、誰かが私を正しい方向に向けることができるかどうか疑問に思いました。

私を混乱させるのは、関係の双方向性をどのように保存するかです。

以下にいくつかの例を示し始めましたが、このタイプのデータを保存するためのベストプラクティスがあるかどうか疑問に思いました。

サンプルデータ

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の間の一方通行の関係を推測するため、満足できません。もちろん、すべての関係を両方の方法で含めない限り、処理時間とテーブルのサイズが2倍になります。

たとえば、次のものを含める必要があります:002、001、0.74

提案2

customer_id、grouping_id
001、1 002、1
003、1 005、2 006、2



4

3 に答える 3

8

リレーショナルシステムで対称関係を処理する方法は次のとおりです。

  • 対称ペアが保存される標準形を選択します(例:customer_id1 <customer_id2)。
  • ビューSYMM_TBLをselectid1、id2、... from ... UNION select id2 as id1、id1 as id2、...FROM..として定義します。

まともなシステムは、このビューを照会するときにパフォーマンス領域であなたを罰するべきではありません。

于 2010-09-17T14:51:41.780 に答える
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。出力をそのように見せるためにデータをピボットする必要がありますが:)

適切なリーグテーブルには、ホームとアウェイの2セットのスコアがあるため、テーブルは対称的です。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
/
于 2010-09-17T10:35:25.880 に答える
1

いつものように、それはあなたがそれを計算した後あなたがデータで何をしたいかに依存します。

重複を特定または特定するだけだとすると、提案1は私が使用するものです。つまり、ペアと長所を単純に格納する2番目のテーブルです。私の唯一の提案は、強度を小数ではなくスケーリングされた整数にすることです。

于 2010-09-17T08:35:45.383 に答える