PostgreSQL

PostgreSQL

【PostgreSQL】PostgreSQLとMongoDB、JSONBはどこまでMongoDBの代わりになるか比較検証

こんにちは、かつコーチです。これでPostgreSQL編は20本目、最終回です。「MongoDBを検討していたけど、PostgreSQLのJSONBがあれば十分では」。こういう相談を、案件のDB選定でよく受けます。JSONB型(バイナリ形式...
PostgreSQL

【PostgreSQL】よくあるPostgreSQLエラーまとめと対処法

こんにちは、かつコーチです。PostgreSQLを触り始めると、赤い文字のERROR:メッセージに何度も出くわします。最初は焦りますが、実は出てくるエラーの種類はある程度パターン化されています。この記事では、初中級者がつまずきやすいPost...
PostgreSQL

【PostgreSQL】Row-Level Securityでマルチテナントのデータを守る実践ガイド

こんにちは、かつコーチです。マルチテナント(1つのデータベースで複数の顧客・組織のデータを扱う構成)のSaaSを設計していると、必ず突き当たるのが「テナントAのデータがテナントBに見えてしまわないか」という不安です。アプリケーションコードで...
PostgreSQL

【PostgreSQL】ロールベースの権限管理をCREATE ROLEでゼロから設計する

こんにちは、かつコーチです。「アプリからは全部postgresユーザーで接続している」というプロジェクト、実は少なくありません。これは動作こそしますが、セキュリティの観点では避けたい設計です。PostgreSQLにはロール(ユーザーとグルー...
PostgreSQL

【PostgreSQL】pg_dumpでバックアップ・リストアする方法をコマンド付きで解説

こんにちは、かつコーチです。「本番データベースのバックアップ、実はコマンド1つも覚えていない」という方は意外と多いのではないでしょうか。バックアップ(データベースの内容を別の場所に複製しておくこと)は、障害やオペレーションミスからデータを守...
PostgreSQL

【PostgreSQL】VACUUMとオートバキュームの仕組みを理解して肥大化を防ぐ

こんにちは、かつコーチです。「テーブルのデータ量は変わっていないのに、ディスク使用量だけがどんどん増えていく」。PostgreSQLを本番運用していると、こういう現象に出くわすことがあります。原因の多くは、VACUUM(不要になった行を回収...
PostgreSQL

【PostgreSQL】EXPLAIN ANALYZEで実行計画を読む

こんにちは、かつコーチです。前回はインデックスの種類を解説しましたが、「インデックスを貼った」だけでは安心できません。実際にそのインデックスが使われているかは、実行計画(PostgreSQLがクエリをどう処理するか事前に立てる計画)を見て確...
PostgreSQL

【PostgreSQL】PostgreSQLのインデックスの種類(B-tree・GiST・GIN・BRIN)

こんにちは、かつコーチです。「インデックスを貼ったのにクエリが速くならない」という相談は、よく聞くと索引の種類がデータの性質に合っていないケースが少なくありません。PostgreSQLはCREATE INDEX ... USINGで複数のイ...
PostgreSQL

【PostgreSQL】シーケンスとSERIAL・IDENTITY列の違い

こんにちは、かつコーチです。PostgreSQLで主キーを自動採番する方法を調べると、SERIALとGENERATED ... AS IDENTITYという2つの書き方が出てきて、どちらを使えばいいか迷った方も多いのではないでしょうか。結論...
PostgreSQL

【PostgreSQL】スキーマを使ってテーブルを整理する

こんにちは、かつコーチです。1つのデータベースにテーブルが50個、100個と増えてくると、users、logs、settingsのような似た名前のテーブルがどのアプリ由来か分からなくなってきます。そんなときに使うのがスキーマです。今回は、P...
PostgreSQL

【PostgreSQL】UPSERT(ON CONFLICT)とRETURNINGで往復を減らす

こんにちは、かつコーチです。「レコードがあれば更新、なければ新規登録」という処理を書くとき、まずSELECTで存在チェックをしてからINSERTかUPDATEを分岐させていませんか。その方法はアプリケーションとDBの往復が増えるうえ、同時ア...
PostgreSQL

【PostgreSQL】ウィンドウ関数の基本:ランキングと集計を両立する

こんにちは、かつコーチです。「各カテゴリの売上ランキングを、元の行を保ったまま表示したい」と思ってGROUP BYを使ったら、個別の行が消えて集計値しか出せなかった、という経験はありませんか。そんなときに使うのがウィンドウ関数です。GROU...
PostgreSQL

【PostgreSQL】再帰CTEで階層データを扱う

こんにちは、かつコーチです。組織図、カテゴリのツリー構造、コメントの返信ネストなど、階層データはWebアプリの定番テーマです。前回はCTEの基本を扱いましたが、今回はCTE自身を参照して繰り返し処理を行う再帰CTEを掘り下げます。CTEの基...
PostgreSQL

【PostgreSQL】CTE(WITH句)の基本:クエリを読みやすく整理する

こんにちは、かつコーチです。サブクエリを何段もネストしたSQLを書いて、自分で見返したときに「これ何をやっているんだっけ」と迷った経験はありませんか。今回はそんなときに役立つCTE(Common Table Expression、共通テーブ...
PostgreSQL

【PostgreSQL】pgvectorでベクトル検索・類似検索を試す

こんにちは、かつコーチです。前回はJSONB型とGINインデックスで半構造化データを扱う方法を解説しました。今回は「データ型・JSON/pgvector」編の最終回として、pgvector拡張機能によるベクトル検索を扱います。上級者向けの内...
PostgreSQL

【PostgreSQL】JSONB型とGINインデックスで半構造化データを扱う

こんにちは、かつコーチです。前回は配列型・範囲型といったPostgreSQL固有のデータ型を紹介しました。今回はPostgreSQLの中でもとりわけ活用の幅が広いJSONB型と、それを高速に検索するためのGINインデックスを解説します。「柔...
PostgreSQL

【PostgreSQL】PostgreSQL固有のデータ型(配列型・範囲型など)

こんにちは、かつコーチです。前回まではPostgreSQLの環境構築を扱ってきました。ここからは「入門・環境構築」編を離れ、PostgreSQLならではのデータ型を扱う新しいカテゴリに入ります。MySQLしか触ったことがない人にとって、Po...
PostgreSQL

【PostgreSQL】psql・pgAdminの使い方の基本

こんにちは、かつコーチです。前回はPostgreSQLのインストールと初期設定を解説しました。今回はPostgreSQLを日常的に操作するための2つのツール、psql(コマンドラインクライアント)とpgAdmin(GUIクライアント)の基本...
PostgreSQL

【PostgreSQL】PostgreSQLのインストールと初期設定

こんにちは、かつコーチです。前回はPostgreSQLの特徴とMySQLとの違いを解説しました。今回は実際に手元の環境にPostgreSQL 16系をインストールし、最初に押さえておきたい初期設定まで解説します。環境構築でつまずくと学習のモ...
PostgreSQL

【PostgreSQL】PostgreSQLとは?拡張性の高いオープンソースRDBMSを初心者向けに解説

こんにちは、かつコーチです。SQL基礎編ではMySQLをベースに、SELECTやJOINといったSQLの基本文法を解説してきました。今回からは新シリーズとしてPostgreSQLを扱っていきます。「MySQLと何が違うの?」「なぜ最近Pos...