2012-01-27 96 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表添加/更新/删除(a)记录之后,旅行表将更新trip_start作为min(arrival_time)作为一组trip_ids和trip_end作为trip_id组的最大值(arrival_time)。Postgresql触发器

+1

你为什么要存储这些信息?它可以很容易地使用SELECT语句来检索。关系数据库中的一条规则:不要存储可以从其他数据派生的数据。 – 2012-01-28 00:01:31

+0

我认为它会更快,因为数据只会定期更新(每个月或2次),而stop_times是一个相对较大的表(约900,000行)。 – visi0n 2012-01-28 00:11:20

+1

现在就去看看,只有在真的慢(太慢)时才进行优化。不要“假设”某事更快。测试它,然后决定。顺便说一句。什么对你来说“比较大”? – 2012-01-28 00:15:33

回答

0

首先,始终从视图开始,并尽可能以适当的索引调整所有内容。像这样的触发器会给你维护问题,所以你想尽量避免它。其次,如果你有这样的触发器并且正在进行批量更新,它会使你的表现出现问题(我从经验中知道)。它可能会导致缓存未命中,这可能会混淆您批量插入或更新数据的能力。其次,如果你需要这样做,最好的选择是有一个单独的表trip_times和定期物化过去旅行的数据。如果stop_times中的数据在特定时间段后是只读的,则此效果最佳。