【入門編】 ネットワークアドレス型 – PostgreSQL

こんにちは!データベースエンジニアの私です。

普段、仕事でPostgreSQLをいじっていると、「このデータ、どうやって持たせるのが一番カッコいいかな?」なんて悩むことがよくあります。その中でも、初心者の方が意外と沼にハマりやすいのが「IPアドレス」の扱いなんです。

「とりあえず文字列(TEXT型)で保存しとけばいいでしょ?」と思っているそこのあなた!……実はそれ、もったいないんです。PostgreSQLには、IPアドレスを扱うための「専用の道具箱」が用意されているんですよ。

今日は、その秘密の道具箱の使い方を、少しだけ覗いてみましょう。

—

IPアドレスは「ただの文字」じゃない

まず、想像してみてください。IPアドレス(例えば `192.168.1.1`)って、ただの数字の羅列に見えますよね。でも、ネットワークの世界では「この範囲からこの範囲まで」といった「グループ(ネットワーク)」としての意味を持っています。

もしこれを普通の「文字」として保存してしまうと、後で「このIPアドレスは、このネットワーク範囲に含まれるかな?」と調べたいときに、とんでもなく面倒な計算をしないといけなくなります。

そこでPostgreSQLの出番です。専用の型を使うと、データベースが賢く処理してくれるようになるんです。

3つの「魔法の型」を知っておこう

PostgreSQLには、主に3つのネットワーク専用型があります。

  • `inet` 型:一番よく使います。IPアドレスと、そのサブネットマスクをセットで保存できます。まさに「この住所はここ!」というピンポイントな指定に最適です。
  • `cidr` 型:ネットワークそのものを表すのに使います。「192.168.1.0/24」のように、範囲をガッチリ定義したいときに便利です。
  • `macaddr` 型:これはネットワーク機器の「指紋」みたいなもの(MACアドレス)ですね。専用のフォーマットで管理してくれます。

これらを使うと、何が嬉しいのか? それは、「比較や計算がめちゃくちゃ速い」ということ。そして、「間違った形式のデータを入れようとすると、PostgreSQLが優しく怒ってくれる(エラーを返してくれる)」という安全機能がつくことです。

便利な「組み込み関数」で楽をしよう

自分で複雑な計算ロジックを書く必要はありません。PostgreSQLは、ネットワーク周りの面倒な計算を肩代わりしてくれます。

例えば、こんなことができます。

  • `host()` 関数:IPアドレスだけをポンと取り出せます。
  • `masklen()` 関数:そのネットワークの広さ(マスク長)がどれくらいか教えてくれます。
  • `<<` や `>>` という演算子:これが面白いんです!「このIPはこのネットワークの中に含まれる?」という判定を、記号ひとつでパッとやってのけます。

— 「192.168.1.5」が「192.168.1.0/24」のネットワークに入っているか確認する
SELECT ‘192.168.1.5’::inet << '192.168.1.0/24'::cidr; -- 結果:true(お見通しです!) ね? 自分でプログラムを書いて判定するよりも、ずっと直感的でミスがありませんよね。

インデックスを貼れば、検索も爆速!

最後に少しだけプロのテクニックを。
IPアドレスのテーブルが増えてくると、検索が遅くなることがあります。そんなときは「インデックス」という、本でいう「索引」を作りましょう。

PostgreSQLの`inet`型には、専用のインデックス(GiSTやSP-GiST)が用意されています。これを使えば、数百万件のIPアドレスの中からでも、目当ての範囲を瞬時に見つけ出せるようになります。

—

最後に

「文字列として保存する」のは確かに一番簡単かもしれません。でも、PostgreSQLの専用型を使うと、データが「生き生き」とし始めます。後から「あ、このネットワークのデータだけ抽出したい!」となったとき、この選択をしておいて本当に良かったと思えるはずです。

データベース設計は、料理と同じです。最初から良い「型」という食材を選んでおけば、後でどんな料理(機能追加)にも対応できますからね。

皆さんもぜひ、次のプロジェクトで `inet` 型デビューしてみてください!
もし分からないことがあれば、いつでもコメントで聞いてくださいね。それでは、素敵なデータベースライフを!

コメント

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