2

私には非常に興味深い仕事があります。しかし、関連するトピックを検索するには、それを一言で表す方法がわかりません。このトピックのタイトルでさえ、私が必要としているものを反映していない可能性があります。それで、誰かがより良いタイトルを持っていれば、歓迎します。

私の問題を説明しようとします。

MySQL db テーブルには約 100,000 行あります。そして、テーブルのエントリを「比較」する必要があります。

「比較」は単に等しいという意味ではありません。計算比較レベルのアルゴリズムがあります。テーブルの列ごとに重み係数があります。エントリ #1 の column1 がエントリ #2 の column2 と等しい場合、このペアにたとえば 5 ポイントを与えることを意味します。各列についても同様です。

これを行う最も簡単な方法は、エントリの各カップルに計算ルールを適用することです。なぜ私はこれを恐れているのですか?100,000 エントリは、約 50 億回の「比較」操作を意味します。確かに、これをオンデマンドで計算し、結果をキャッシュのどこかに保存できます。しかし、最も明白な方法が最も効果的ではないと私は信じています。

だから、私の最初の質問は、私の目標を達成するためのブルートフォース以外のより良い方法はありますか?

2 つ目の質問は、計算に適したツールに関するものです。

  1. アプリケーション言語は PHP です。したがって、テーブル全体をメモリにロードし、データを反復処理する必要があります。
  2. MySQL でストアド プロシージャを作成します。
  3. MongoDB の集計フレームワークまたは MapReduce を使用します。

少なくとも私は最初の方法が好きです。何よりも - 最後です。

このような事例を経験された方からのアドバイスやアドバイスをお待ちしております。

グーグルに助けを求める方法がわからないので、リンクをいただければ幸いです。

アップデート:

計算規則は、私が説明したよりも少し複雑です...

テーブルには、(1 つずつではなく) グループとして一度に使用される一連の関連する列があります。仮定しましょう:

table、、、、などのフィールドがtag_1ありtag_2ますtag_nrow_1およびrow_2- のエントリtable

ルール(疑似コード):

if(row_1.tag_1==row_2.tag_1)
{
    // gives 10 points
}
elseif(row_1.tag_1 is in row_2.tags && row_1.tag_1!=row_2.tag_1)
{
    // gives 5 points
}
....
// and so on

基本的に、2 つの配列の共通点を確認する必要があります。空でない場合 - ポイントが与えられます。2 つの行のタグのインデックスが一致する場合、追加のポイントが与えられます。

ストアド プロシージャ言語を使用してこれをどのように達成できるのでしょうか。どんなプログラミング言語でも簡単にできるからです。

ストアド プロシージャがこれを実行できる場合、それが私の選択です。

4

2 に答える 2

2

静的テーブルがある場合、結果をどこかに(おそらくデータベースに戻して)保存する限り、選択した違いはありません。

データが変更されている場合は、新しい各行をすべての行と比較する必要があります。これは、基本的に全表スキャンです。これはおそらくデータベースで行うのが最適です。

データがメモリに収まる場合(そして500,000行がメモリに収まる場合)、(2)はおそらく同等のハードウェアの(3)よりも高速になります。「同等のハードウェア」は非常に重要な考慮事項です。

ほとんどの場合、私は(2)を選びます。クエリは次のようになります。

select t.id, t2.id,
       ((case when t1.col1 = t2.col1 then 5 else 0 end) +
        (case when t2.col2 = t2.col2 then 7 else 0 end) +
        . . .
       )
from t cross join t2

map-reduceに慣れている場合は、そこでコーディングする方が簡単な場合があります。私は両方の言語を知っており、このようなものにはSQLを好みます。

于 2013-02-12T11:47:07.383 に答える
1

あなたはこのようなことをすることはできません:

UPDATE table SET points = points+5 WHERE column1 = column2

特定の値を確認しすぎる場合は、次のように試すことができます。

UPDATE table SET points = points+5 WHERE column1 = 'somevalue' AND column2 = 'somevalue'
于 2013-02-12T11:45:05.753 に答える