PostgreSQL 9.1 をバックエンドとして使用するレシピ Web サイトを運営しています。ユーザーがレシピを検索すると、ユーザーが探しているものに応じてその場でクエリを作成します。たとえば、ユーザーが調理時間が 30 分未満のすべてのレシピを検索したい場合、次のクエリを生成します。
SELECT * From Recipes WHERE CookTime < 30;
特定のレシピを「非表示」にする必要があります。つまり、それらのレシピが検索に表示されることは決してありません。それらに到達する唯一の方法は、URL を直接知ることです。これを行うために、Recipes テーブルに新しい列を追加しました。
ALTER TABLE Recipes ADD COLUMN Hidden boolean not null default false;
CREATE INDEX IDX_Recipes_Hidden ON Recipes(Hidden);
私の考えは、「NOT HIDDEN」というフレーズをすべての WHERE 句にハードコーディングすることです。たとえば、上記のクエリは次のようになります。
select * from recipes where not Hidden and CookTime < 30;
私の質問:
クエリ アナライザーによると、これでビットマップが生成され、2 つのインデックスが結合されます。レシピの 99% は非表示になりません。この手法が、すべてのクエリから特定のレシピを除外するための最良かつ最速の方法であるかどうかを知りたい. 非表示のレシピ用に別のテーブルを作成するのが最も速い方法であることはわかっていますが、これは大量のリファクタリングになるため、これは避けたいと思います。