Postgresとは?多くのアプリを支えるデータベースをわかりやすく解説
Postgres(正式名称はPostgreSQL)は、無料のオープンソースのリレーショナルデータベースです。アプリのデータを行と列のテーブルに保存し、テーブル同士を結びつけ、SQLと呼ばれる言語で、それらについての問い合わせに答えるプログラムです。信頼性が高く、データの正しさを厳密に保つことで知られ、顧客リストから大企業の記録まで、あらゆるものを扱える柔軟さがあります。多くのWebアプリや、それらをホストするサービスの多くが、Postgresの上に作られています。
AIでアプリを作るときに大切な理由
AIアプリビルダーがプロジェクトに「データベース」を追加するとき、それがPostgresである可能性は高いです。Postgresを使うのにSQLを書く必要はありませんが、少し理解しておくと大いに役立ちます。
- データを、データベースが必要とする形で説明できる。 「顧客は複数の注文を持ち、各注文は複数の商品を持つ」という説明は、そのままテーブルに対応します。
- 必要な保護を頼める。 AIが適切なルールを設定すれば、Postgresは重複したメールアドレスや、存在しない顧客への注文といった不正なデータを、自分で拒否できます。
- AIが行ったことを読める。 テーブル名、列、関係は、コードに触れなくても、テーブルビューアーで簡単に確認できます。
身近なたとえ:とても厳格な書類保管室
顧客、注文、商品など、種類ごとに保管キャビネットがある書類室を想像してください。キャビネットの引き出しのカードには、いつも同じ印刷された欄があり、そこを記入します。各カードには一意の番号があり、注文のカードには、顧客の詳細を繰り返し書くことはせず、「顧客番号214」と書いて、顧客の引き出しを指すだけです。
係員は厳格です。存在しない顧客への注文は受け付けません。必須の日付欄が空白のカードも受け付けません。また、ある口座のカードから別の口座のカードへお金を移すよう頼まれたら、両方を行うか、どちらも行わないかのどちらかです。片方だけを行うことはありません。
その係員がPostgresです。引き出しがテーブル、印刷された欄が列、それぞれのカードが行、そして「顧客番号214」というリンクが外部キーです。
Postgresが得意なこと
| 機能 | 平易な意味 |
|---|---|
| テーブルと関係 | データはテーブル同士を指し示す形で保存されるので、同じ内容を5か所にコピーしなくて済む |
| SQL | 問い合わせのための標準的な言語。「先月の未払いの注文を、新しい順に」といった問い合わせができる |
| トランザクション(ACID) | 一連の変更は、すべて行われるか、まったく行われないかのどちらか。サーバーが途中で停止しても同じ |
| 制約 | データベース自身が強制するルール。必須項目、一意のメールアドレス、テーブル間の正しいリンクなど |
| インデックス | テーブルが大きくなっても検索を速く保つための、検索の近道 |
| JSONB | 固定の構造が合わないとき、柔軟なドキュメント形式のデータを列に保存できる |
| 全文検索 | 単純なケースなら、別の検索サービスなしで、テキスト欄の単語を検索できる |
| 拡張機能 | 地図や位置情報のためのPostGIS、AIの埋め込みベクトルを保存するためのpgvectorなどの追加機能 |
| 行レベルのセキュリティ | 特定のユーザーがどの行を見られるかを、データベース内部で決めるルール |
Postgresは、1980年代にカリフォルニア大学バークレー校での研究プロジェクトとして始まり、1990年代以降は世界中のコミュニティによってオープンに開発されてきました。この長い歴史があるため、標準的な選択肢として選ばれることが多いです。ドキュメントが充実し、サポートが広く、主要なクラウドプロバイダーはすべてマネージド版を提供しています。
具体例:スプレッドシートをテーブルに変える
ケータリングの小さな事業を営んでいて、すべてを1つのスプレッドシートで管理しているとします。各行がイベントで、顧客の名前、電話番号、メールアドレス、日付、メニュー項目、価格が書かれています。
すぐに問題が出てきます。同じ顧客が6行に登場し、電話番号が2つ違っています。メニュー項目は「カナッペ×40、サラダ×2」のように1つのセルに打ち込まれているため、今月カナッペを何個作ったかを合計できません。
Postgresでは、同じ情報が4つのテーブルになります。
| テーブル | 列 | 補足 |
|---|---|---|
| clients | id、name、phone、email | メールアドレスは一意である必要がある |
| events | id、client_id、date、venue、status | client_idは実在する顧客と一致する必要がある |
| menu_items | id、name、unit_price | 料理ごとに1行 |
| event_items | event_id、menu_item_id、quantity | イベントと料理をつなぎ、数量を持つ |
これで、顧客の電話番号は1か所に保存されます。「3月にカナッペを何個作ったか?」は、1つのSQLの問い合わせで答えられます。そして、新しいイベントとその項目を記録するとき、トランザクションによって、項目の半分だけ保存されたイベントが残ることはありません。
これは、AIに「スプレッドシートからアプリを作って」と頼むときに、人がよく飛ばしてしまう段階です。スプレッドシートをアプリに変える方法では、さらに詳しく説明しています。
主な用語
- テーブル、行、列: 種類のもの、その1件、その1つの情報。
- 主キー: 各行の一意のID。通常は
id。 - 外部キー: 別のテーブルの行を指す列。
client_idなど。 - スキーマ: すべてのテーブルと列の設計。
- マイグレーション: スキーマへの、保存されて繰り返し実行できる変更。「eventsテーブルにvenue列を追加する」など。
- クエリ: SQLで書かれた問い合わせや命令。
- 接続文字列: バックエンドがデータベースにアクセスするための、アドレスとパスワード。秘密情報です。環境変数と秘密情報を参照してください。
- マネージドPostgres: Postgresの実行、バックアップ、アップデートを代行してくれるサービス。
アプリがこれらのテーブルに対して毎回行う基本的な操作、つまり作成、読み取り、更新、削除については、CRUDとはを参照してください。
よくある間違いと誤解
- 1つの巨大なテーブル。 スプレッドシートの列をそのまま1つのテーブルに写すと、同じ重複の問題が起きます。繰り返しになるものは、それぞれ独自のテーブルに分けてください。
- リストを1つのテキスト欄に入れる。 「カナッペ×40、サラダ×2」を1つの列に入れると、数えたり検索したりできません。リンク用のテーブルを使ってください。
- 制約がない。 「メールアドレスは一意」や「すべてのイベントには顧客が必要」といった制約がないと、不正なデータが静かに入り込み、数か月後に問題として表面化します。
- 本番環境のデータベースを手で変更する。 スキーマの変更は、マイグレーションとして依頼してください。そうすれば変更が記録され、繰り返し実行できます。
- ブラウザがデータベースに直接アクセスさせる。 フロントエンドは、権限をチェックするバックエンドを経由すべきです。データベースのパスワードがページのコードに入ることは、決してあってはなりません。
- 「Postgresは大企業向けだけ」。 50行の順番待ちリストでも問題なく動き、アプリが成長しても別のデータベースに移す必要はありません。
- データベースがバックアップだと思い込む。 データベースはデータを保存しますが、データを削除してしまうことから自動的に守ってくれるわけではありません。ホスティングサービスがどのようなバックアップを提供しているか確認してください。
AIに頼むべきこと
- 「[物]をデータベースに保存して。テーブルは次のとおり:…。フィールドは次のとおり:…。各[注文]を[顧客]に紐づけて。」
- 「顧客のメールアドレスは一意にして。次のフィールドは必須にして。顧客のいない注文は許可しないで。」
- 「スキーマの変更はすべてマイグレーションとして行って。」
- 「私たちが最もよく行う検索、つまり顧客別と日付別の注文検索にインデックスを追加して。」
- 「データベースへのアクセスはすべてサーバーを経由して。接続文字列は環境変数に保存して。」
そもそもデータベースという考え方に慣れていない場合は、まずデータベースとはを読み、それからここに戻ってきてください。フルスタックアプリでは、データベースがフロントエンドやバックエンドの隣でどこに位置するかがわかります。
MythexのPostgres
Mythexは、データベースが必要なプロジェクトそれぞれに、専用のPostgresデータベースを用意します。設定は不要です。チャットで頼むか(「ウェイティングリストのメールアドレスをデータベースに保存して」)、/databaseコマンドを使うと、Mythexがデータベースを接続し、接続情報をアプリに注入し、必要に応じてテーブルを作成します。公開されたアプリのデータベースは、5分間アイドル状態が続くとスリープし、次のリクエストで起動します。課金されるのは、実際に起動していた時間だけで、アプリの構築と同じクレジット残高から差し引かれます。詳細はデータベースのドキュメントにあります。また、データを扱うアプリの例を見るには、ダッシュボードのテンプレートが役立ちます。
よくある質問
PostgresとPostgreSQLは同じものですか?
はい。PostgreSQLが正式名称で、Postgresが一般的な短い呼び方です。どちらも同じオープンソースのリレーショナルデータベースを指します。
Postgresは無料ですか?
はい。PostgreSQLは、寛容なPostgreSQLライセンスのもとでオープンソースとして提供されており、商用製品での利用を含めて無料で使えます。料金が発生するのは、それを動かすサーバーやマネージドサービスに対してだけです。
PostgresとMySQLの違いは何ですか?
どちらも無料のSQLリレーショナルデータベースで、ほとんどのアプリに適しています。Postgresは、厳格なデータの整合性、JSONBや配列などの豊富なデータ型、大規模な拡張機能のエコシステムで知られています。MySQLは、シンプルさと、Webホスティングでの長い歴史で知られています。
Postgresは小さなアプリにも向いていますか?
はい。1つのテーブルだけの順番待ちリストにも、大規模な本番システムにも向いています。そのため、アプリが大きくなってもデータベースを切り替える必要はありません。マネージドサービスを使えば、データベース管理者がいなくても簡単に運用できます。