Я создаю специальное программное обеспечение для форума для создаваемого сайта, которое включает в себя 2 таблицы (которые имеют отношение к этому вопросу): topics
и posts
. Сообщение относится к теме, и тема содержит тему, а каждое сообщение содержит тело.
Вот основные структуры таблицы со столбцами, относящимися к моему вопросу:
CREATE TABLE topics (
id bigserial NOT NULL,
title varchar(128) NOT NULL,
created timestamp with time zone NOT NULL default NOW(),
updated timestamp with time zone NOT NULL default NOW(),
PRIMARY KEY (id)
);
CREATE TABLE posts (
id bigserial NOT NULL,
topic_id bigint NOT NULL REFERENCES topics(id) ON DELETE CASCADE,
body text NOT NULL,
created timestamp with time zone NOT NULL default NOW(),
updated timestamp with time zone NOT NULL default NOW(),
PRIMARY KEY (id)
);
Вот мои два варианта построения полнотекстовых индексов.
Опция 1: Создание динамических индексов цветов для столбцов заголовка / тела.
CREATE INDEX topics_title_idx ON topics USING gin(to_tsvector(title));
CREATE INDEX posts_body_idx ON posts USING gin(to_tsvector(body));
Вариант 2: Создайте дополнительные столбцы для хранения данных заголовка / тела, выделенных в цветовой форме, и добавьте к ним индексы.
ALTER TABLE topics ADD COLUMN topics_vector tsvector NOT NULL;
CREATE TRIGGER topics_ins BEFORE INSERT OR UPDATE ON topics FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(title_vector, 'pg_catalog.english', title);
CREATE INDEX topics_title_idx ON topics USING gin(title_vector);
ALTER TABLE posts ADD COLUMN posts_vector tsvector NOT NULL;
CREATE TRIGGER posts_ins BEFORE INSERT OR UPDATE ON posts FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(body_vector, 'pg_catalog.english', body);
CREATE INDEX posts_body_idx ON posts USING gin(body_vector);
Я спорю между ними, так как вариант 1 сэкономит мне место на диске, но обеспечит более медленный поиск, а для варианта 2 потребуется дополнительное дисковое пространство при одновременном ускорении поиска.
Давайте представим, что есть 20 новых тем и 100 новых сообщений в день. Что бы вы выбрали? Что делать, если количество тем / сообщений в день вдвое больше? Пять раз что? Десять раз? Меняется ли ваше решение одного против другого?