世界を動かす技術を、日本語で。

2026年、Postgresを使おう

2026年2月6日原文(tigerdata.com)

概要

  • Postgres は多用途なデータベースとして、検索・ベクトル・時系列・キューなどを一つに統合
  • 複数の専用データベースを使うことによる 複雑さ とコスト増大の問題提起
  • Postgres拡張機能 は専用DBと同等またはそれ以上の性能を発揮
  • 99%の企業は Postgresだけで十分 な要件を満たす
  • Tiger Data で簡単にPostgresの拡張機能を利用可能

Postgresが提供する「一つ屋根の下」の柔軟性

  • Postgres はリビング、キッチン、ガレージのように多用途を一つの「家」で実現
  • 検索、ベクトル、時系列、キューなど、 複数の用途 を一つのDBでカバー
  • 専用DBベンダーは「 用途ごとに最適なツール」という神話を広めている現実
  • 「正しい道具を正しい用途で」という考えが 運用負担の増大 を招く罠
    • 複数DB:クエリ言語、バックアップ、監査、認証情報、監視体制が全て増加
    • 障害対応やテスト環境構築の 煩雑化

AI時代における単一DBの重要性

  • AIエージェント の普及でDBスプロール(乱立)が深刻化
  • Postgresなら 単一コマンド で環境構築やテストが完了
  • シンプルさは 運用効率 だけでなく、AI時代の 必須条件

専用DBの神話と現実

  • 専用DB は特定用途で「わずかに」優れている場合があるのみ
  • ほとんどの場合、 複雑さ・コスト・運用負担 が増大
  • 大規模な1%の企業のみが専用DBを必要とする現実
  • Postgres拡張機能( 同等かそれ以上のアルゴリズム)はオープンソースで実績豊富

データベース乱立による複合コスト

  • 認知負荷 :SQL、Redis、Elasticsearch、MongoDB、Kafka、InfluxDBなど複数言語・操作体系
  • データ整合性 :DB間同期ジョブの失敗、データドリフト、再同期作業
  • SLA低下 :複数システムの稼働率が掛け算で下がり、 ダウンタイム増加
  • Postgres拡張 はNetflix、Spotify、Uber、Reddit、Instagram、Discordなどで実績

Postgresで実現できること

  • Elasticsearch不要 :BM25アルゴリズムがpg_textsearchで利用可能
  • Pinecone不要 :pgvectorscaleでDiskANN(Microsoft Research発)を実装、低レイテンシ・高スループット
  • 時系列データ :自動パーティショニング、最大90%圧縮、連続集計、全てSQLで完結
  • AIアプリ :キーワード検索+セマンティック検索を 1クエリ・1トランザクション で実現

99%の企業にとっての最適解

  • Postgres はほとんどの用途をカバー
  • 専用DBが必要なのは 膨大なスケール や特殊要件がある1%のみ
  • その段階では自社でベンチマークし、 本当に必要な時だけ 専用DB導入
  • 「正しい道具を正しい用途で」というアドバイスはベンダーの都合

Tiger DataでのPostgres拡張活用

  • Tiger Data で全ての拡張機能が利用可能
  • 数分で無料DB作成
    • 例:psql "postgresql://user:pass@your-instance.tsdb.cloud.timescale.com:5432/tsdb"
  • 専用DB不要、Postgresのみで運用可能

Elasticsearchの運用課題とPostgresの優位性

  • Elasticsearch はGC、シャード設計、データ同期、監視コストが高い
  • Postgres + pg_textsearch で検索運用をシンプル化

PostgresでBM25が使える理由

  • pg_textsearch でBM25アルゴリズムを実装
  • ターム頻度、IDF、長さ正規化による 高精度ランキング

技術情報・リリースノートの配信

  • 最新技術記事やリリース情報 をメールで受信可能

Hackerたちの意見

確かにそう思う。なんでもっと人がPostgresを使わないのか分からないよ。大量のデータ(例えばGISやnDベクトル)を扱う時は、MacのPostgres.appを立ち上げて、必要なものをちょちょっとインストールすれば、すぐに動くし、十分速いんだよね。多くの分野にとって本当に素晴らしい選択だと思う。ただ、Postgresが「その仕事に適したツール」だと思うこともあるけど、時には(相対的な)シンプルさが欲しい時もあるよね。複雑さやデプロイの面で、SQLiteみたいなものを使うべきだと思う。シンプルさを軽視するのは賢明じゃないし、私は中程度のトラフィックのサーバーをいくつか運営するのに使ってるよ(少なくとも、私が使ってるハードウェアにとっては中程度のトラフィックだけど)。

私もSQLiteのファンだよ。開発中の一番いいところは、コンテナなしでフルインテグレーションテスト用のデータベースを簡単に立ち上げたり、消したりできることだね。バックアップも簡単になるし、たぶん十分な性能だと思う。

「どのデータバックエンドを使うか」って話題は、みんなが何のためにそれを必要としているのかでいろんなバリエーションに混乱しちゃうよね。ここでの議論は本当にいろんな方向に行く。簡単なウェブアプリを作ってる人もいれば、数億人のユーザーにスケールする複雑なウェブアプリを作ってる人もいるし、ローカルアプリを作ってる人もいるし、ただいじってるだけの人もいる。バックエンドがデータレイクと組織のデータウェアハウスと同期する必要があることを広く考えてる人もいるしね。個人的には、他の人と共有する必要があるほぼすべてのユースケースにはPostgresが好きだよ(CRUDの更新を提供するかもしれない複数のクライアントがいるアプリとか)。SQLiteを2〜3人で共有する小さなアプリを作るためにWALを使ったこともあるけど、理想的ではなかった。Postgresは機能や拡張がたくさんあって、同時書き込みもめっちゃ速いし、一発で解決策を求めるなら間違いないけど、もちろんSQLiteの設定とは違うよね。Postgresの痛みの多くは、効果的に知識のあるDB管理者になることを学ぶことだと思う。開発者とDB管理者の専門家の間にいる感じだよ。実際に何かを本番環境でデプロイするなら、すべてが正しく設定されていることを願うのはちょっと怖いよね。Supabaseですら、このプロセスを簡単に始めるためには、あまり理解されていないセキュリティの前提を理解する必要があって、ちょっと不気味だし。正直言って、こういう議論からあまり得るものはないかな。みんなの仕事や趣味の生活には使い方や変数が多すぎて、どこに底があるのか分からない。SQLiteを使う人もいれば、Postgresを使う人もいるし、誰も聞いたことのない変なものを使う人もいる。生のSQLを使うのが怖いから、即座にGraphQL機能をデータ取得のメインモードにしたい人もいるしね。ここに来てRedisが必要な理由を話す人もいる。ノイズが多すぎるから、私はただPostgresを使い続けるよ。無料でつまらなくて速いからね。結局、使えるものを作りたいだけなんだ。これをうまくやるのは一人だと難しいし、他の専門家のチームがいて、正しい方法でデプロイするためのパズルのピースを組み合わせたり、Redisやその他のものを追加したりするのを手伝ってくれる人がいないと、本当に大変だよ。どこから始めればいいのかも分からないし。SQLiteは本質的に孤独な開発者を支援する唯一の解決策のようだけど、多くの人に使われるべきものを作ろうとすると、トレードオフが大きいよね。

多くの場合、時には(相対的な)シンプルさが欲しいこともあるし、複雑さやデプロイの面でもSQLiteみたいなものを使うべきだと思う。シンプルさを求めてSQLiteを使おうとすると、結局は面倒なことにぶつかって、解決するのが「セットアップして忘れる」Postgresのインスタンスを設定するよりも手間がかかることが多いんだよね。これは個人的なことだけど…「低メンテナンス用にパッケージ化されたPostgres」って、たくさんのOSパッケージマネージャーにあるよ!小規模なデータ分析でも、SQLiteのパフォーマンスにはまだまだ改善の余地があるし(以前、QGISがSQLite DBで苦労してたけど…pgはほぼ瞬時に処理してくれた。インデックスとかも…SQLiteでは簡単に得られないものもあったし)。もしSQLiteがうまくいくならそれは素晴らしいけど、シンプルなpgのセットアップを試してみる価値はあると思う。pgを使うのがどれだけ面倒かを理解するためにね(私にとっては、そこまで高くないけど)。

ウェブスケールじゃないから、mongoDBはウェブスケールなんだよね。

ちょっと話が逸れるけど、Postgresでユーザーアカウントに特定のデータベースへのフルアクセスを与える魔法の呪文が、簡単に信頼できる形で見つけられないんだよね。特にクラウドプロバイダーが提供するマネージドPostgresの場合。GRANT ALL PRIVILEGESは全然うまくいかないし。毎回権限を調べて修正するのが面倒で、シンプルな使い方でもPostgresを使うのが難しいんだよね。でも、アドホックで使うなら何かアドバイスある?

SQLiteを最も成功裏に使ったのは、実際には二つのユースケースなんだ。まず、データ処理に使ってる。大量のデータを取得して、別のセットアップに変換する必要があるとき、Pythonでもできるけど、SQLの方が表現力があって、新しいデータベースを作って、持ってるデータで埋めて、新しいデータを取得して組み合わせて、更新を永続的なデータストア(通常はPostgres)にエクスポートすることができる。二つ目は、ローカルのセーブファイルが必要なとき。小さなローカルアプリはセーブファイルの方が便利なこともあって、そのファイルは拡張可能なフォーマットにしておけば、後から更新できる。これはあまり一般的ではないけど、役立つこともある。最初のユースケースは非常に強力だよ。跡形もなく消せる一時的なSQLデータベースは素晴らしいし、複雑なクエリを実行できるのも本当に助かる。ただ、99%の時間はPostgresを使ってるけどね。ちゃんと動くし、デフォルトもまともだし、拡張性もすごいし、OracleやMySQLとは違って、今まで必要なことを満たしてくれたことがない。

PostgresはデフォルトでMySQLよりもディスクを多く消費することが分かったよ。その差はかなり大きいんだ。つまり、毎月余分にお金を払わなきゃいけないってこと。確かにPostgresは多くのサブシステムを統合しているシステムのようで、複雑さも増すよね。いい点を挙げてる投稿があるから、悪い点も指摘しておくよ。君もサービスを売ろうとしてるし、それもいいことだね。

一部の人は圧縮されたZFSボリュームでPostgresを使って大成功を収めているよ。

逆に、プレーンなPostgreSQLのダンプからの復元は、プレーンなMySQLのバックアップよりもずっと速いよ。MySQLには代替戦略もあるけど、それは余計な手間がかかるね。

問題は、Postgresが1行あたり約24Bのオーバーヘッドを使うことだね。小さいテーブルでは問題ないけど、数十億行になると、バイトがすぐに積み重なっていく。さらにリンクテーブルがその数を増やすから、データを大量に消費するんだよね。最終的には、スペースを節約するためにバイナリカラムやカスタムエンコードされた値を使うことになる。DBの利点が薄れてしまう感じ。

Redisをディスクにシリアライズされたテーブルで置き換えることには懐疑的だな。Redisのポイントはメモリ上にあって、ホットパスのクエリでバックエンドDBの負荷を軽減できることだからね。それに、その設計はcronが必要で、キーのパージの間にテーブルがディスクを埋め尽くす可能性がある。

Hacker Newsで議論の続きを見る