1

多くのサイトから取得され、個々のサイトのAPIを介して収集された製品の詳細を格納するデータベースがあります。フィードを呼び出すと、詳細がデータベーステーブルに保存されます。

私が抱えている問題は、まったく同じ商品が売り手によって多くのサイトにリストされているため、データベースに重複したアイテムがあり、それらをWebページに表示すると多くの重複があることです。

問題は、アイテムに明確な一意の識別子がなく、アイテムの特定の詳細(多くの場合があります)があり、次に販売者からのアイテムの説明があることです。

私が欲しいのは、アイテムが一度表示されてから、アイテムがリストされている他の場所の詳細をユーザーに提供することです。

データベース全体の速度を低下させることなく、入ってくる重複をどのように識別しますか?次に、すべての複製から1つの広告を選択し、その広告が表示されている他のサイトを保存するにはどうすればよいでしょうか。

助けてくれてありがとう。

4

2 に答える 2

3

問題は2つあり、どちらもあなたの側にあります。それを処理する方法を理解したら、プログラムにコードを記述します(JavaまたはSQLは簡単です)。最初に名前を付けてから、解決策を特定します。

  1. いくつかの不明な理由により、複数のサイトから製品の説明を収集しても同じ製品は収集されないと想定しました。

  2. スプレッドシートのプロトタイピング機能を使用している場合は問題ない、一般的で無意味なId列に慣れています。しかし、データベースや開発レベルの機能に必要なものにはほど遠いです。あなたのユーザー(または上司)は当然データベースにデータベース機能を期待していましたが、あなたは何も提供しませんでした。(いいえ、あいまい文字列ロジックやいかなる種類の魔法も必要ありません。)

解決

これは、リレーショナルデータベースをモデル化するためのIDEF1X標準の要約バージョンです。識別子の部分。

  1. データベースの用語で考える必要があり、関数を実行するために必要なデータベーステーブルについて考える必要があります。つまり、自動インクリメントId列を使用することは許可されていません。その列はスプレッドシートにを提供しますRowIdが、テーブルの内容や製品を識別する列については何も意味しません。

  2. そして、単に別のWebサイトからデータをリッピングすることはできません。あなたは、自分のWebサイトが製品に何を必要としているかを考える必要があります。あなたの会社は製品が何であるかをどのように理解していますか、そしてそれはどのように製品を識別しますか?

  3. すべての列と列のデータ型を特定します。

  4. どの列が必須で、どの列がオプションであるかを特定します。

  5. 強力な識別子を特定します。例えば。ManufacturerおよびModel; Product Name長いものではなく、短いものですDescription(または、会社の場合は、長い説明識別子です)。ユーザーと協力して、それを解決します。

  6. 実際には、、、ProductなどManufacturerのテーブルの小さなクラスターがあります。ProductTypeVendor

  7. データを複製しないように、これらのテーブルを整理し、正規化します。

  8. これらの識別子は、少し敬意を持って扱うようにしてください。どちらがユニークになるかを選択してください。それらは候補キーです。テーブルごとに少なくとも1つ必要であり、に複数存在しProductます。検索されるすべての識別子にインデックスを付ける必要があります(一意かどうか)。一意のインデックスはNull許容できないため、オプションの列を選択できないことに注意してください。

  9. の単一の一意の識別子を作成するのProductは、単一の列ではない場合があります。大丈夫です。データベース内のキーの複数の列を評価できます。それらは複合キーと呼ばれます。

  10. 候補キーの1つである、最も安定した(変更されない)一意の識別子を取得し、それを主キーにします。

  11. 一意の識別子である主キー(複合キーの場合もあります)が非常に長いため、子テーブルに移行される主キーに適さない場合に限り、代理キーを追加します。それがコラムになります。これは追加の列と追加のインデックスであることに注意してください。これは、候補キーの識別子の代わりにはなりません。削除することはできません。IdProduct

これまでのところ、Webの企業側に製品データベースがあります。これはそれにとって意味のあることです。これで、Webの反対側から製品を評価できるようになりました。そして私たちがそうするとき、私たちは強いフレームワークを私たちの側に持っています、それに対して私たちはウェブの反対側から得たゴミを測定することができます。

フィード

  1. WebSiteフィードを管理するためのテーブルが必要です。

  2. との間に連想テーブル(多対多)がProductありWebSiteます。それを呼びましょうProductSiteProductIdWebSiteCode. It may containPrice`のみが含まれます。内容は、単一のフィードサイクルに対して有効です。

  3. 各フィードをステージングデータベースまたはスキーマ、受信ProductInテーブル、場合によってはソースWebサイトごとに1つロードします。これは、外部ソースからのフラットファイルです。列を追加しIsValid、デフォルトをtrueに設定します。

  4. ProductIn次に、そのテーブルとその緩いフロッピーの内容を、Productそのテーブルとその強力な識別子と比較するSQLを記述します。

    • 私がそれを行う方法は、別々のチェックのいくつかの波であり、それぞれが失敗した行IsValidをfalseでマークします。最後に、IsValid行をに挿入しますProductSite

    • あなたは幸運かもしれません、そして楽観的なアプローチで逃げてください。つまり、いくつかの重要な列で一致が見つかった場合、その一致は有効です。IsValid(デフォルトを逆にしてブール値を更新します)。

    • これは、落ち着くまで前後の作業が必要になる手順です。そのため、識別子に関してユーザーと協力する必要があります。目標は外部製品を除外することですが、出発点は多くを除外します。これには、テーブルに戻ってProduct、識別子のコンテンツ(行の値)、および一致する行を識別するために使用するその他の関連する列を改善することが含まれます。

  5. Webサイトごとに繰り返します。

  6. Product次に、信頼できる情報を使用して、テーブルからWebサイトにデータを入力し、から販売されている製品を持っているサイトを示しますProductSite

于 2010-11-26T11:33:56.130 に答える
1

これは(まだ)コードやデータベースの問題ではないと思います。あなたは言う:

問題は、アイテムに明確な一意の識別子がないことです

あなたはあなたがあなたのためにそれをするようにコンピュータに頼むことができる前にそのユニークさが何であるかを理解する必要があります。ある種のあいまいな文字列類似性アルゴリズムが必要なようです。

重複していると思われるデータの例が役立つ場合があります。

于 2010-11-25T11:56:37.367 に答える