DB2 のテンポラル表が勝手にデータを作ってくれて面白い #1

DB2 10.x にはテンポラル表っていうのがある。時間をベースに制御してくれる表。いくつか種類があるのだけど、その中から「アプリケーション期間テンポラル表」っていうのを紹介してみたい。

行のデータがいつ有効かをDB2のシステム側が面倒見てくれる仕組み。

例えばこんなシナリオ

 

旅行商品の情報テーブルがある。商品を売り出した後にイマイチ売れ行きが良くないので一定期間だけ値下げしたい。システムメンテがあるのでその期間は売り出したくない。等の操作が発生する。

 

■テーブルを作る (テンポラル表)

テーブルを作るときに、PERIOD BUSINESS_TIME (開始日時カラム, 終了日時カラム)というのを入れておくだけでいい。ここでDB2が時間をベースに考えてくれる。

db2 => CREATE TABLE travel(
        trip_name VARGRAPHIC(10) NOT NULL,  #旅行の名前
        destination VARGRAPHIC(5) NOT NULL, #行き先
        departure_date DATE NOT NULL,       #出発日
        price DECIMAL(8) NOT NULL,          #価格
        bus_start DATE NOT NULL,            #販売開始日
        bus_end DATE NOT NULL,              #販売終了日
        PERIOD BUSINESS_TIME (bus_start, bus_end),
        PRIMARY KEY (trip_name, BUSINESS_TIME WITHOUT OVERLAPS)
);
  
db2 => INSERT INTO travel
VALUES ('夏の北海道二泊三日', '札幌', '2014-08-20',50000,'2014-02-01', '2014-08-01');
  
db2 => SELECT * FROM travel;
  
TRIP_NAME            DESTINATION DEPARTURE_DATE PRICE      BUS_START  BUS_END
-------------------- ----------- -------------- ---------- ---------- ----------
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-02-01 2014-08-01
  
  1 レコードが選択されました。

ここまでは特に何もない。ただテーブルを作って1件データを入れただけ。

■期間限定で値下げしよう

売れ行きがあんまり良くないので、3月いっぱいは値下げしよう!さて旅行商品テーブルにはどんな操作をしたらいいか? 期間を分けて複数データ作らなければいけない。でもそれ、1操作だけで良いの。3月1日から4月1日までの間は45000円です、って更新する。

db2 => UPDATE travel FOR PORTION OF BUSINESS_TIME FROM '2014-03-01' TO '2014-04-01'
SET price = 45000 WHERE trip_name = '夏の北海道二泊三日';
  
db2 => SELECT * FROM travel ORDER BY bus_start ;
  
TRIP_NAME            DESTINATION DEPARTURE_DATE PRICE      BUS_START  BUS_END
-------------------- ----------- -------------- ---------- ---------- ----------
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-02-01 2014-03-01
夏の北海道二泊三日   札幌        2014-08-20         45000. 2014-03-01 2014-04-01
夏の北海道二泊三日   札幌        2014-08-20         50000. 2014-04-01 2014-08-01
  
  3 レコードが選択されました。

UPDATE ひとつ発行したらうまいこと期間が重複しないよう行が分割された!

続きは明日。