複数のフィードから収集された重複アイテムを識別し、データベースにそれらにリンクする方法
-
28-09-2019 - |
質問
多くのサイトから取得され、個々のサイトAPIを介して収集された製品の詳細を保存するデータベースがあります。フィードを呼び出すと、詳細はデータベーステーブルに保存されます。
私が抱えている問題は、まったく同じ製品が売り手によって多くのサイトにリストされているため、私はデータベースにアイテムを複製することになり、ウェブページにそれらを表示すると、多くの複製があります。
問題は、アイテムには明らかな一意の識別子がなく、アイテムの特定の詳細(その多くが存在する可能性がある)、そして売り手からのアイテムの説明があることです。
私が望むのは、アイテムが一度表示され、その他のアイテムがリストされている場所の詳細をユーザーに提供することです。
データベース全体を遅くすることなく、入った重複をどのように識別しますか?また、すべての複製から1つの広告を選択してから、広告が表示される他のサイトを保存するにはどうすればよいですか。
助けてくれてありがとう。
解決
問題は2つあり、どちらもあなたの側にあります。それを処理する方法を見つけたら、コードをプログラムに書き込むことができます(JavaまたはSQLは簡単です)。最初に名前を付けてから、ソリューションを特定します。
何らかの未知の理由で、Mulitpleサイトから製品の説明を収集することは同じ製品を収集しないと想定しています。
あなたは一般的で無意味なものに慣れています
Id
列。これは、スプレッドシートのプロトタイピング機能を使用しているときに問題ありません。しかし、データベースまたは開発レベルの機能に必要なものに近い場所ではありません。ユーザー(または上司)は、データベースから自然にデータベース機能を期待しており、提供していません。 (いいえ、あらゆる種類のファジー文字列ロジックや魔法を必要としません。)
解決
これは凝縮バージョンです IDEF1X リレーショナルデータベースのモデリングの標準。部分識別子。
データベースの用語で考え、機能を実行する必要があるデータベーステーブルについて考えてください。つまり、自動インクリメントを使用することは許可されていません。
Id
桁。その列はスプレッドシートを与えますRowId
, 、しかし、それはテーブルのコンテンツ、または製品を識別する列について何も意味しません。また、別のWebサイトからデータを放つだけでは、製品にWebサイトに必要なものを考える必要があります。あなたの会社は製品をどのように理解していますか、そしてそれはどのように製品を識別しますか?
列のすべての列とデータ型を識別します。
どの列が必須で、どの列がオプションであるかを特定します。
どちらが強いかを特定します 識別子. 。例えば。
Manufacturer
とModel
;ショートProduct Name
, 、長くはありませんDescription
(またはあなたの会社のための可能性があります、長い説明 は 識別子)。ユーザーと協力して、それを解決します。あなたは実際にあなたが周りに小さなテーブルのクラスターを持っていることがわかります
Product
, 、 そのようなManufacturer
,ProductType
, 、 多分Vendor
, 、などこれらのテーブルを整理し、それらを正規化して、データを複製しないようにします。
これらの識別子を少し敬意を持って扱うようにしてください。ユニークなものを選択してください。それらは 候補キー. 。テーブルごとに少なくとも1つが必要で、複数のテーブルがあります
Product
. 。検索されるすべての識別子は、インデックス作成する必要があります(一意かどうか)。一意のインデックスはめまいがないため、オプションの列を選択できないことに注意してください。単一の一意の識別子を作るもの
Product
単一の列ではない場合があります。それは大丈夫です、データベース内のキーの複数の列を評価できます。という 複合キー.最高の、最も安定した(変更しないもの)一意の識別子、候補キーの1つを取り、それを作成します 主キー.
一意の識別子が複合キーである可能性のある主要な鍵が非常に長く、したがって、子供のテーブルに移行される一次キーには不適切である場合にのみ、 追加 a サロゲートキー. 。それがでしょう
Id
桁。これは追加の列と追加のインデックスであることに注意してください。それはの識別子の代替ではありませんProduct
, 、候補キー。それらを削除することはできません。
これまでのところ、Webの会社側に製品データベースがありますが、それは意味があります。今、私たちはウェブの反対側から製品を評価する立場にあります。そして、私たちがそうするとき、私たちは私たちの側に強いフレームワークを持っています。これは、ウェブの反対側から得られるゴミを測定することができます。
フィード
あなたには必要だ
WebSite
フィードを管理するためのテーブル。間に連想テーブル(多くの人から多数)があります
Product
とWebSite
. 。それを呼びましょうProductSite
. 。それには私たちのみが含まれますProductId
, 、 そしてそのWebSiteCode. It may contain
価格。内容は、単一のフィードサイクルに有効です。各フィードをステージングデータベースまたはスキーマにロードします。
ProductIn
テーブル、たぶん1つのソースWebサイト。これは、外部ソースからのフラットファイルです。列を追加しますIsValid
デフォルトをtrueに設定します。次に、それを比較するいくつかのSQLを書きます
ProductIn
ゆるくてフロッピーの内容物を備えたテーブル、Product
強力な識別子を備えたテーブル。私がそれをする方法は、個別のチェックのいくつかの波、それぞれが失敗する行をマークし、
IsValid
偽り。最後に挿入しますIsValid
私たちに列ProductSite
.あなたは幸運であり、楽観的なアプローチで逃げるかもしれません。つまり、いくつかの重要な列で試合を見つけている限り、試合は有効です。 (デフォルトと更新を逆にします
IsValid
ブール)。これは、落ち着くまで何らかの前後の作業を必要とするProcです。そのため、ユーザーとdentifiersを使用する必要があります。目標は、外部製品を除外しないことですが、出発点は多くを除外します。それには私たちに戻ることが含まれます
Product
識別子のコンテンツ(行の値)のテーブルと改善、および一致する行を識別するために使用するその他の関連する列。
各Webサイトについて繰り返します。
今、私たちのウェブサイトを私たちから入力します
Product
テーブル、私たちが自信を持っている情報を使用し、どのサイトが販売用の製品を持っているかを示しますProductSite
.
他のヒント
これはコードやデータベースの問題ではないと思います(まだ)。あなたは言う:
問題は、アイテムに明らかな一意の識別子がないことです
コンピューターにあなたのためにそれをするように頼むことができる前に、あなたはその統一性が何であるかを解決する必要があります。ある種のファジー、ストリングの類似性アルゴリズムが必要だと思われます。
複製が役立つと考えるデータの例がいくつかあります。