1

私は現在2つのテーブルを持っています:

CrawlData
id (autoincrement), Source, Destination, and some more columns

Nodes
id (autoincrement), URL

Nodesテーブルには、CrawlDataからの個別の Source 値が含まれています

ここで、 CrawlDataの Source と Destination のテキストではなく、ノードの ID を含む一種のルックアップ テーブルであるテーブルが必要です。

URL=Source と URL=Destination で Join を使用して Select クエリですべての ID を取得できますが、これらを組み合わせて、2 つの列を持つ新しいテーブルEdgesでそれらを取得する方法もわかりません。

  • SourceNode (= CrawlData.Source = URL のノードからの ID)
  • DestinationNode (= CrawlData.Destination = URL のノードからの ID)
4

2 に答える 2

2

ステートメントを使用して、ステートメントINSERTによって返されるレコードを取得できます。SELECTINSERT INTO...SELECT

INSERT INTO Edges(SourceNode, DestinationNode)
SELECT  b.ID SourceNode,
        c.ID DestinationNode
FROM    CrawlData a
        INNER JOIN Nodes b
            ON a.Source = b.URL
        INNER JOIN Nodes c
            ON a.Destination = c.URL

結合についてさらに詳しく知りたい場合は、以下のリンクにアクセスしてください。

実行を高速化するには、次のステートメントを実行して列を追加し、大規模な RDBMS で実行する場合に速度が低下するINDEXのを回避します。FULL TABLE SCAN

ALTER TABLE Nodes ADD INDEX (URL);

SourceおよびDestination列のすべての値が に存在するNodes.URL場合、これらの列を外部キーとして宣言します。

ALTER TABLE CrawlData 
      ADD CONSTRAINT cd_fk1 FOREIGN KEY (Source) REFERENCES Nodes(URL)
ALTER TABLE CrawlData 
      ADD CONSTRAINT cd_fk2 FOREIGN KEY (Destination) REFERENCES Nodes(URL)

それ以外の場合は、それらに通常のインデックスを追加します

ALTER TABLE CrawlData ADD INDEX (Source);
ALTER TABLE CrawlData ADD INDEX (Destination);
于 2013-03-28T14:00:04.643 に答える
1

Nodes テーブルには 2 回参加できます。一度、Source を使用して URLK に参加します。次回は宛先を使用します。

概念的には、それぞれ異なる名前 (「S」と「D」など) を持つ Nodes テーブルの 2 つのコピーを使用するようなものです。あなたは得る:

select S.ID As SOURCE_ID, D.ID As DEST_ID
from CrawlData
join Nodes S on Source = S.URL
join Nodes D on Destination = D.URL
于 2013-03-28T14:00:43.103 に答える