2012-01-27 5 views
0
CREATE TABLE stop_times 
(
    trip_id int NOT NULL, 
    arrival_time time NOT NULL, 
    departure_time time NOT NULL, 
    stop_id int NOT NULL, 
    stop_sequence int NOT NULL, 

    FOREIGN KEY(trip_id) REFERENCES trips, 
    FOREIGN KEY(stop_id) REFERENCES stops 
); 

CREATE TABLE trips 
(
    trip_id int NOT NULL, 
    trip_name text NOT NULL, 
    trip_start time, 
    trip_end time, 

    PRIMARY KEY(trip_id) 
); 

То, что я хотел бы сделать это после того, как я добавить/обновление/удаление (а) запись (ы) в таблице stop_times стол поездки обновит trip_start как мин (ARRIVAL_TIME) для группы trip_ids и trip_end как max (arrival_time) для группы trip_ids.Postgresql Trigger

+1

Почему вы хотите сохранить эту информацию? Его можно легко получить с помощью инструкции SELECT. Одно правило в реляционной базе данных: не хранить данные, которые могут быть получены из других данных. –

+0

Я думал, что это будет быстрее, потому что данные будут периодически обновляться (каждый месяц или 2), а stop_times - относительно большая таблица (около 900 000 строк). – visi0n

+1

Идите с целью взглянуть на это, и только оптимизируйте его, если он действительно слишком медленный. Не «предполагайте» что-то быстрее. Протестируйте его, а затем решите. Btw. что для вас «относительно большое»? –

ответ

0

Во-первых, всегда начинайте с просмотров и настраивайте все как можно лучше с соответствующими индексами. Подобный триггер даст вам проблемы с обслуживанием, и вы хотите избежать этого, когда сможете. Во-вторых, если у вас есть триггер над чем-то подобным и он делает массовые обновления, это сделает вашу работу проблематичной (я знаю по опыту). Это может вызвать промахи в кэше, которые могут действительно испортить вашу способность вставлять или обновлять данные навалом.

Во-вторых, если вам нужно сделать это, лучше всего иметь отдельную таблицу trip_times и периодически материализуют данные для прошлых поездок. Это лучше всего работает, если данные в stop_times доступны только для чтения через определенный промежуток времени.

Смежные вопросы