我正在为我正在构建的网站创建自定义论坛软件,其中包括2个表(与此问题相关):主题和帖子.帖子属于主题,主题包含主题,而每个帖子包含主体.
以下是与我的问题相关的列的基本表结构:
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,PRIMARY KEY (id) );
以下是构建全文索引的两个选项.
选项1:在标题/正文列上创建动态tsvector索引.
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:创建额外的列以保存tsvector化的标题/正文数据,并在其上添加索引.
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,body); CREATE INDEX posts_body_idx ON posts USING gin(body_vector);
我在两者之间进行辩论,因为选项1将节省我的磁盘空间,但提供较慢的搜索,而选项2将需要额外的磁盘空间,同时提供更快的搜索.
让我们假装有20个新主题&每天100个新帖子.你会选哪个?如果每天主题/帖子的数量是两倍呢?五倍呢?十次?你的决定是否会改变?