我将所有权作为“项目->所有权->用户”关系传递,以下函数将项目所有者的名称作为文本获取:
CREATE FUNCTION owners_as_text(projects) RETURNS TEXT AS $$
SELECT trim(both concat_ws(' ', screen_name, first_name, last_name)) FROM users
INNER JOIN ownerships ON users.id = ownerships.user_id
WHERE deleted_at IS NULL AND ownable_id = $1.id AND ownable_type = 'Project'
$$ LANGUAGE SQL IMMUTABLE SET search_path = public, pg_temp;
然后使用它来构建一个忽略重音的索引:
CREATE INDEX index_projects_on_owners_as_text
ON projects
USING GIN(immutable_unaccent(owners_as_text(projects)) gin_trgm_ops)
当项目更新时,该索引也会更新。但是,当所有者名称更改时,该索引不会被触及,对吧?
在这种情况下,如何强制索引定期更新以赶上?
(REINDEX
不是一个选项,因为它是锁定的,并且会导致死锁,应该同时发生写入操作。)