0

MSSQL2005 の全文検索への進出を開始しています。これは開発中の新しいデータベースなので、いじくり回すことができます。

「回答」と「コメント」という他の 2 つのテーブルと 1 対多の関係を持つ「フォーム」テーブルがあるとします。ユーザーが 1 つの検索用語を入力して、全文検索を介してこれら 3 つのテーブルすべてをペグできるようにしたいと考えています。最善の方法は何ですか?インデックス付きビューを作成して作業を高速化できるようです。

インデックス付きビューを使用する場合 (とにかくこれが最善の方法ですか?)、1 対多の関係をどのように処理すればよいですか? 私が本当に知りたいのは、子 Answer/Comment テーブルで見つかった検索結果を含む "Form" テーブルの ID だけだと仮定して、見つかったエントリを含むフォーム全体を表示できるようにします。ビューの内部結合により、複数の「マスター」フォーム行が返されます - パフォーマンスが良くないように思えます。すべての子の回答/コメント行をビューの 1 つの「列」に連結するのはどうですか? だから代わりに....

Form 1, Answer A, Comment A 
Form 1, Answer B, Comment A 
Form 1, Answer A, Comment B 
Form 1, Answer B, Comment B

...それは...

Form 1, Answer A Answer B, Comment A Comment B

私が気にするのは、そのマスター「フォーム」行の ID だけです。

これは私には理にかなっているように思えますが、全文検索に関するベスト プラクティスがまだよくわからないので、正しくアプローチしているかどうかに興味があります。

更新:インデックス付きビューはかなり厳密なようです。左結合もサブクエリもありません。そのため、扱いにくすぎなければ、トリガーによって入力された要約テーブルのパスをたどることができます。

4

1 に答える 1

1

SQL では、次の経験則を使用する必要があります。 - 取得する要素から開始する - フィルタを追加して、取得する要素のセットを制限する

それは簡単なことのように聞こえますが、実際にあなたがしなければならないことはそれだけです。ここでは、フォーム要素 (行) が必要なので、次のように記述します。

SELECT ID
FROM Form

次に、フィルターを追加して、合計セットを関心のあるフォームのセットに制限します。これは、IN 述語を使用して行います。Answer と Comment は Form と 1:n の関係にあると言うように、これは Answer と Comment が Form.ID への FK を持つことを意味します。したがって、where を追加できます。

WHERE ID IN
(SELECT FormID FROM Answer WHERE CONTAINS(FullTextColumnInAnswer, @stringToSearch))
OR
ID IN
(SELECT FormID FROM Comment WHERE CONTAINS(FullTextColumnInComment, @stringToSearch))

これにより、一連の異なる Form.ID 値が生成されます。これは、全文検索が有効になっているフィールドで検索する文字列を含む、少なくとも 1 つの回答またはコメントを持つフォームの ID です。

SqlServer 2000 では、複数の CONTAINS ステートメントを使用するため、2005 よりも遅くなる可能性があります。

代わりに結合シナリオで CONTAINSTABLE() を使用することもできます。例については BOL を参照してください。

于 2008-12-30T09:30:57.277 に答える