【入門編】 EXCLUDE制約 – PostgreSQL

こんにちは!データベースの世界へようこそ。
普段、エンジニアとしてバリバリとPostgreSQLを触っていると、「これ、めちゃくちゃ便利なのに意外と知られてないな」と思う機能がいくつかあります。

その筆頭が、今回お話しする「EXCLUDE制約(除外制約)」です。

なんだか難しそうな名前ですよね。「制約」なんて言われると、なんだか先生に叱られているような気分になるかもしれません。でも、これ、実は私たちの生活をめちゃくちゃ楽にしてくれる「お守り」のようなものなんです。

今日は、専門用語を抜きにして、この頼れる機能を紹介させてください。

—

会議室のダブルブッキング、どう防ぐ?

想像してみてください。あなたは、ある会社のオフィスで「会議室の予約システム」を作ることになりました。

当たり前ですが、「同じ会議室を、同じ時間に二人で予約する」のはNGですよね。いわゆる「ダブルブッキング」です。

普通なら、新しい予約を入れる前に「その時間、空いてるかな?」とデータベースに問い合わせて、空いていれば予約を追加する……という手順を踏みますよね。でも、もしものすごく忙しいタイミングで、二人の社員が同時に「同じ会議室の同じ時間」を予約しようとしたらどうなるでしょう?

運が悪ければ、チェックのすり抜けが起きて、ダブルブッキングが発生してしまいます。

EXCLUDE制約は「最強の受付係」

そんなとき、データベースに「EXCLUDE制約」という魔法をかけておくと、事態は一変します。

この制約を一言で言うと、「重なりの禁止」です。

「この会議室とこの時間帯の組み合わせが、すでに誰かと被っていたら、どんなに頑張ってもデータを入れるのを拒否する!」とデータベースに命令しておくんです。

こうしておけば、アプリケーション側で「空いてますか?」なんてドキドキしながら確認しなくても、データベースが「おっと、そこはもう予約が入ってるよ!」と門前払いしてくれるようになります。めちゃくちゃ頼もしいですよね。

「GiST」という名の相棒

さて、ここで少しだけ、PostgreSQLの凄腕スキルについて触れさせてください。

EXCLUDE制約を実際に使うとき、私たちは「GiST(ジスト)」というインデックス(索引)を一緒に使います。これがまた優秀なんです。

普通のインデックスが「本を引く時の目次」なら、GiSTは「地図」のようなもの。データ同士の「距離感」や「重なり具合」を計算するのが得意なんです。「この時間とあの時間は重なってるね」という判断を、爆速でやってのけます。

この「GiST」と「EXCLUDE」のコンビネーションがあれば、会議室の予約だけでなく、こんなことだって簡単にできちゃいます。

  • シフト管理: 同じ日に同じスタッフを2つの現場に配置させない。
  • 配送計画: 同じトラックを、同じ時間に別の場所へ走らせない。
  • 学内授業: 同じ教室で、同じ時間に複数の授業を入れない。

「失敗できない」を守る安心感

プログラミングをしていると、「もしも〇〇が起きたらどうしよう……」という不安は尽きません。でも、データの整合性(データの正しさ)をデータベースの深いところで守ってくれる仕組みがあれば、コードはずっとシンプルに、そして安全になります。

「後からデータの修正をする」という一番大変な作業を、そもそも発生させない。これこそが、プロのデータベース設計者が目指す「優しい設計」なんです。

—

もし皆さんのシステムで「時間の重複」や「場所の取り合い」に頭を悩ませているなら、ぜひ一度、PostgreSQLの「EXCLUDE制約」を思い出してみてください。

最初は少し難しく感じるかもしれませんが、一度慣れてしまうと「これなしでどうやってシステム作ってたんだろう?」と思うはずですよ。

それでは、また次の記事でお会いしましょう!Happy Coding!

コメント

タイトルとURLをコピーしました