Могут ли материализованные представления в PostgreSQL наследоваться?

Я использую PostgreSQL для данных временных рядов. Существует таблица событий и многораздельные таблицы, такие как Event_2016, Event_2017, которые наследуются от Event с ПРОВЕРКОЙ ОГРАНИЧЕНИЯ для диапазона дат. Поэтому при запросе таблицы событий PostgreSQL использует только необходимые дочерние таблицы.

Для сворачивания событий я использую материализованное представление EventByDay. Для обновления требуется чтение из всех таблиц Event_ *.

Могу ли я использовать материализованные представления так же, как таблицы выше, чтобы ограничить объем данных в каждом материализованном представлении? (EventByDay_2016 наследуется от EventByDay).


person KingOfCoders    schedule 22.02.2017    source источник


Ответы (1)


Нет, MVIEW не может участвовать в наследовании таблиц.

Но вы можете создать (обычную) дочернюю таблицу, а затем использовать insert into .. select ..., используя запрос из MVIEW. Если вы хотите сохранить запрос MVIEW в базе данных, создайте представление, которое вы будете использовать для заполнения дочерней таблицы.

Что-то вроде этого:

Начальная настройка:

create view v_event_by_day_2016 
as 
-- this is the complete query from your MVIEW
select ...;

create table event_by_day_2016
as
select *
from v_view_one;

alter table event_by_day_2016 inherit event_by_day; 
alter table event_by_day_2016 add constraint check (...);

Обновите таблицу:

truncate table event_by_day_2016;
insert into event_by_day_2016
select *
from v_event_by_day_2016;

В качестве альтернативы вы можете использовать delete, чтобы данные в дочерней таблице можно было обновлять транзакционным способом.

person a_horse_with_no_name    schedule 22.02.2017
comment
Спасибо, усечение .. вставка будет показывать другое поведение, чем одновременное обновление на MVIEW? - person KingOfCoders; 23.02.2017
comment
@StephanSchmidt: да. Вот почему я также упомянул метод delete, который делает изменения видимыми только после того, как вы зафиксируете удаление и вставку. - person a_horse_with_no_name; 23.02.2017
comment
Хорошо, тогда я пойду по этому пути и надеюсь, что Postgres будет поддерживать частичное обновление MVIEW или наследование MVIEW в будущем. - person KingOfCoders; 23.02.2017