Upgrade to Pro — share decks privately, control downloads, hide ads and more …

時間枠の扱いをいい感じにする話 / good-time-schedule-window

時間枠の扱いをいい感じにする話 / good-time-schedule-window

soudai sone

July 06, 2021
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. What is it? id begin_at end_at room_id 1 2021-07-06 11:30:00

    2021-07-06 12:00:00 1 2 2021-07-06 11:30:00 2021-07-06 12:00:00 1 3 2021-07-06 11:30:00 2021-07-06 12:00:00 2 4 2021-07-06 12:00:00 2021-07-06 12:59:59 1 5 2021-07-06 13:00:00 2021-07-06 14:00:00 1 6 2021-07-06 10:00:00 2021-07-06 15:00:00 1
  2. What is it? id begin_at end_at room_id 1 2021-07-06 11:30:00

    2021-07-06 12:00:00 1 2 2021-07-06 11:30:00 2021-07-06 12:00:00 1 3 2021-07-06 11:30:00 2021-07-06 12:00:00 2 4 2021-07-06 12:00:00 2021-07-06 12:59:59 1 5 2021-07-06 13:00:00 2021-07-06 14:00:00 1 6 2021-07-06 10:00:00 2021-07-06 15:00:00 1 同じルームなのに重複してる
  3. What is it? id begin_at end_at room_id 1 2021-07-06 11:30:00

    2021-07-06 12:00:00 1 2 2021-07-06 11:30:00 2021-07-06 12:00:00 1 3 2021-07-06 11:30:00 2021-07-06 12:00:00 2 4 2021-07-06 12:00:00 2021-07-06 12:59:59 1 5 2021-07-06 13:00:00 2021-07-06 14:00:00 1 6 2021-07-06 10:00:00 2021-07-06 15:00:00 1 12:00:00の瞬間が重複している
  4. What is it? id begin_at end_at room_id 1 2021-07-06 11:30:00

    2021-07-06 12:00:00 1 2 2021-07-06 11:30:00 2021-07-06 12:00:00 1 3 2021-07-06 11:30:00 2021-07-06 12:00:00 2 4 2021-07-06 12:00:00 2021-07-06 12:59:59 1 5 2021-07-06 13:00:00 2021-07-06 14:00:00 1 6 2021-07-06 10:00:00 2021-07-06 15:00:00 1 beginもendも空いてる時間だが組み合わせると重複する
  5. 自己紹介
 曽根 壮大(36歳)
 Have Fun Tech LLC 代表社員
 
 そ 

    ね   たけ とも
 • 日本PostgreSQLユーザ会 勉強会分科会 担当
 • 3人の子供がいます(長女、次女、長男)
 • 技術的にはWeb/LL言語/RDBMSが好きです
 • コミュニティが好き
  6. 範囲型と排他制約 id begin_at end_at room_id 1 2021-07-06 11:30:00 2021-07-06 12:00:00

    1 2 2021-07-06 11:30:00 2021-07-06 12:00:00 1 3 2021-07-06 11:30:00 2021-07-06 12:00:00 2 4 2021-07-06 12:00:00 2021-07-06 12:59:59 1 5 2021-07-06 13:00:00 2021-07-06 14:00:00 1 6 2021-07-06 10:00:00 2021-07-06 15:00:00 1 こういうデータが防げる!
  7. ???「部屋毎に時間枠が違うんだよね」
 
 
 ルームid 1 は 10:00 - 12:00 ルームid

    2 は 10:00 - 15:00 の中で予約可能、みたいなやつ チェック制約とストアドファンクション
  8. チェック制約とストアドファンクション id schedule_at room_id 1 [2021-07-06 11:30:00,2021-07-06 12:00:00) 1 2

    [2021-07-06 12:00:00,2021-07-06 13:00:00) 1 3 [2021-07-06 11:30:00,2021-07-06 12:00:00) 2 4 [2021-07-06 09:30:00,2021-07-06 12:00:00) 1 room_id room_at 1 [2021-07-06 10:30:00,2021-07-06 12:00:00) 2 [2021-07-06 10:00:00,2021-07-06 15:00:00)
  9. 検索結果を制約にする CREATE FUNCTION get_valid_room( schedule_at tstzrange, set_room_id bigint ) RETURNS

    int AS $$ DECLARE responsed_row_count int; BEGIN SELECT COUNT('*') INTO responsed_row_count FROM room WHERE room_at @> schedule_at AND room_id = set_room_id RETURN responsed_row_count ; END; $$ LANGUAGE plpgsql; -- ストアドファンクションをチェック制約に設定する ALTER TABLE 予約 ADD CONSTRAINT check_room CHECK (get_valid_room(schedule_at,room_id) = 1); ストアドファンクションは 戻り値がある。 その戻り値を使ってチェック制約 の条件にする `@>` は範囲の含む検索