2012-01-27 150 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中的數據在特定時間段後是隻讀的,則此效果最佳。