9

People (名前、姓、住所、SSN など) のテーブルがあるとします。

指定された人物 A に「非常に似ている」すべての行を検索したいと考えています。A とテーブル People のすべての行のある種のファジー論理比較を実装したいと考えています。複数の列で個別に機能するいくつかのファジー推論ルールがあります (例: 名前に関する 3 つのファジー ルール、姓に関する 2 つのルール、住所に関する 5 つのルール)。

問題は、次の 2 つのアプローチのどちらが優れているか、またその理由は何ですか?

  1. すべてのファジー ルールをストアド プロシージャとして実装し、1 つの重い SELECT ステートメントを使用して、A に「非常に似ている」すべての行を返します。このアプローチには、soundex、sim メトリックなどの使用が含まれる場合があります。

  2. A に "かなり似ている" 精度の低い結果を返す 1 つ以上の単純な SELECT ステートメントを実装し、A を (データベース外の) 返されたすべての行とあいまい比較して、"非常に似た" 行を取得します。そのため、あいまい比較は私のお気に入りのプログラミング言語で実装されます。

Table People には最大 50 万行が必要で、このようなクエリを 1 日に約 500 ~ 1000 回行いたいと考えています。私は MySQL を使用しています (ただし、これはまだ考慮されていません)。

4

4 に答える 4

2

単純な選択を使用して、データベースを壊さずに最も近い一致を取得してから、アプリケーション層で手間のかかる作業を行うのが最善だと思います。このソリューションを提案する理由は、スケーラビリティです。アプリケーション層で重労働を行う場合、問題はノード間で類似性の処理を分散して結果を取得できるマップ削減スタイルのソリューションの完璧なユース ケースです。データベースを経由する場合よりもはるかに高速に戻ります。さらに、この方法では、データベースがロックされたり、同時に実行されている可能性のある他の操作が遅くなったりすることはありません。

于 2013-04-08T16:10:53.023 に答える
0

私が検討するオプションは、人物のSoundEx値である「People Talbe」に列を追加することです。

を使用して結合を行いました

Select [Column}
From People P 
    Inner join TableA A  on Soundex(A.ComarisonColumn) = P.SoundexColumn

これにより、People テーブルの SoundEx 列と同じ SoundEx 値を持つ TableA のすべてが返されます。

そのサイズのテーブルに対してそのようなクエリを使用したことはありませんが、試してみても問題はありません。その SoundExColumn にインデックスを付けて、パフォーマンスを向上させることもできます。

于 2013-04-11T13:39:25.483 に答える