18

これは非常に単純な質問かもしれないので、事前にお詫びしますが、私はデータベースの使用法に非常に慣れていません。

Postgresに複数の結合されたテーブル全体で全文検索を実行させたいのですが。関連するモデルUserProfileとUserInfoを持つモデルUserのようなものを想像してみてください。検索はユーザーのみを対象としますが、UserProfileおよびUserInfoからの情報が含まれます。

検索にジンインデックスを使用することを計画しています。ただし、テーブル全体から集約されたtsvectorを保持し、トリガーを設定して最新の状態に保つために、Userテーブルに個別のtsvector列が必要かどうかはわかりません。または、tsvector列なしでインデックスを作成できる場合は、関連するテーブルの関連するフィールドのいずれかが変更されるたびに、それ自体を最新の状態に保ちます。また、これをすべて作成するためのコマンドの構文に関するヒントもいただければ幸いです。

4

1 に答える 1

12

最善の答えは、おそらく各テーブルに個別のtsvector列を含めることです(もちろん、インデックスをオンにします)。共有tsvectorまでデータを集約すると、個々のtsvectorが更新されるたびに、その共有tsvectorに多くの更新が作成されます。

テーブルごとに1つのインデックスが必要になります。次に、クエリを実行するときに、フィールドごとに1つずつ、複数のWHERE句が必要になることは明らかです。PostgreSQLは、インデックスのどの組み合わせを使用するかを自動的に判断して、最も迅速な結果を提供します。おそらくビットマップスキャンを使用します。(複数の列一致句が必要なため)クエリの記述が少し複雑になりますが、必要な場合に一部のフィールドのみをクエリする柔軟性が維持されます。

複数のテーブルを追跡する1つのインデックスを作成することはできません。これを行うには、各テーブルに個別のtsvector列とトリガーを設定して更新する必要があります。

于 2010-02-09T11:19:54.053 に答える