← コンテナ(Docker) ログ・モニタリング →

📑 この章の目次

title: データベース適材適所 icon: 🗄️ card_desc: データを保存する道具の選び方 — RDB/NoSQL・SQLite vs PostgreSQL・何で選ぶかの判断軸 slug: 07-database

07 データベース適材適所 — SQLite・PostgreSQL 等、何で選ぶかの判断軸

「データベース」と一口に言っても、目的によって最適な道具は違います。小さなツールには SQLite、大規模サービスには PostgreSQL。この章では、「何で選ぶか」の判断軸を根本から理解します。


一言でいうと

データベースは、アプリが扱うデータを保存・検索・更新・削除する仕組みです。しかし「1つの万能なデータベース」は存在しません。データの規模・同時書き込みの量・データの形・運用コストによって、最適な道具が変わります。この章の核心は、「どの場面でどれを選ぶか」の判断軸を持つことです。


1. なぜ「データベースの選び方」があるのか

まず、そもそもなぜデータベースが必要か。アプリのデータをただのテキストファイルに保存してはいけないのでしょうか。

テキストファイルでの保存は、小規模なら動きます。しかし:

これらを解決するのがデータベースです。データの保存・検索・整合性を、安全かつ高速に担う専用の仕組みです。

💡 SQL(エスキューエル/Structured Query Language)は、RDB(後述)を操作するための共通言語です。「このデータを取得して」「このデータを更新して」を、データベースの種類を問わずほぼ共通の文法で書けます。

なぜ「選ぶ」必要があるのか

ここが重要です。すべての場面で最適な「1つのデータベース」はありません

つまり**「適材適所」**——目的に応じて最適な道具を選ぶ、という発想そのものが、この章のテーマです。


2. データベースの2大分類 —— RDB と NoSQL

データベースは大きく2つに分かれます。

RDB(リレーショナルデータベース)

RDB(アールディービー/Relational Database/リレーショナルデータベース)は、データを**表(テーブル)**で管理する方式です。Excelのシートのように、**行(レコード)と列(カラム)**でデータを整理します。

NoSQL(非リレーショナル)

NoSQL(ノーエスキューエル/「SQLでない」の意)は、表以外の形でデータを扱う方式の総称です。「事前に形を決めなくてよい・柔軟」(形がころころ変わる非構造化データ・半構造化データ向き)反面、厳密な整合性は RDB ほど強くないことが多いです。

代表的な種類:

種類 何を保存するか 代表例
ドキュメント型 JSON のような柔軟なデータ(形が変わる) MongoDB(モンゴディービー)
キー・バリュー型 「鍵」に対する「値」の高速な取得 Redis(レディース)

💡 現実の多くのサービスは両方を組み合わせて使います。メインデータは RDB で整合性を保ちつつ、一時キャッシュやアクセスカウント等の「高速に読み書きしたい」部分は Redis のような NoSQL で補う、といった使い分けです(→ 第9章 キャッシュ)。


3. 🔑 RDB の中の適材適所 —— SQLite vs PostgreSQL

ここが本章の核心の1つ目です。RDB の中でも、規模によって選ぶ道具が変わります。代表的な2つを比較します。

SQLite —— 「ファイル1つ」の軽量版

SQLite(エスキューライト)は、データベース全体が1つのファイルに収まる、極めて軽量な RDB です。

PostgreSQL / MySQL —— サーバー型の本格版

PostgreSQL(ポストグレス・キューエル/通称「ポストグレス」)や MySQL(マイエスキューエル)は、専用のサーバーとして動かす本格的な RDB です。

比較表

SQLite PostgreSQL / MySQL
形態 ファイル1つ(サーバー不要) サーバー型(専用プロセス)
導入 圧倒的に簡単 サーバー構築・管理が要る
同時書き込み 弱い(ロックが発生しやすい) 強い(多数の同時書き込み可)
向く場面 個人ツール・プロトタイプ・組込・テスト 本番のWebサービス・大規模
運用コスト ほぼゼロ 監視・バックアップ等の手間あり

例えていうと: 手帳と金庫

💡 判断の目安: 「同時に大勢が書き込む本番サービスか?」が分かれ目です。個人開発・プロトタイプ・テストなら SQLite で十分。不特定多数が同時に書き込む本番Webサービスなら PostgreSQL/MySQL が基本です。


4. NoSQL の代表 —— 用途で選ぶ

RDB が「万能で堅実な本棚」なら、NoSQL は「特定の用途に特化した専用道具」です。

ドキュメント型 MongoDB —— 形が変わるデータに

MongoDB は、JSON(→ 第3章)のような形がころころ変わるデータを保存するのに向きます。事前に列(スキーマ)を決めなくてよいので、「今後データの項目が増えそう・形が固まっていない」場面で柔軟です。

キー・バリュー型 Redis —— 超高速な読み書き

Redis は、「鍵に対する値」を超高速で読み書きするのに特化しています。ただし電源を切ると消える可能性があるインメモリ——データをメモリ上に置く方式が基本のため)ため、消えて困るメインデータではなく、一時的なデータ(キャッシュ・一時セッション等)向けです(→ 第9章 キャッシュ)。

NoSQL = RDB より優れている、ではない: NoSQL は特定の用途で高速・柔軟ですが、厳密な整合性や**複雑な関連(リレーション)**では RDB に分があります。「新しいから NoSQL」で選ぶのは禁物です。用途に合うかで選ぶのが適材適所です。


5. 🔑 「何で選ぶか」の判断軸

ここが本章の核心の2つ目です。具体的な製品名を覚えるより、「どの軸で選ぶか」の判断フレームを持つ方が応用が効きます。以下の5つの軸で、目的を整理します:

判断軸 問うべきこと 選び方の目安
規模 データは数十万件? 億件? 大規模 → サーバー型 RDB / NoSQL
同時書き込み 同時に書き込む人は1人? 何千人? 大人数同時 → PostgreSQL/MySQL・Redis
データの形 形は固定? ころころ変わる? 固定 → RDB/柔軟 → ドキュメント型
運用コスト サーバー管理できる? 手軽さ優先? 手軽さ → SQLite/管理可 → サーバー型
検索の複雑さ 複雑な関連・集計? 単純な取得? 複雑 → RDB/単純高速 → Redis

補足: トランザクションと ACID

RDB の強みの1つがトランザクションtransaction/「一連の処理を1つのまとまりにする」仕組み)です。「送金」なら「Aの口座から減らす」+「Bの口座に増やす」をセットで成功か、両方なかったことかにできます。この整合性の性質ACID(アシッド)と呼びます:

💡 「お金など絶対に狂ってはいけないデータ」には、ACID を強く持つ RDB が基本です。「少し狂っても速度優先」なデータ(アクセスカウント等)には、緩い整合性で高速な NoSQL も選択肢に入ります。何を優先するかで選ぶ、という具体例です。


6. なぜ「適材適所」が開発の作法なのか

ここまでを読むと、データベース選びが「名前を知っているか」でなく**「目的に合わせて判断できるか」**の問題だと分かります。

作法として位置づけられる理由

  1. 過剰選びを避ける —— 小さなツールに大規模向けDBを選ぶと、運用コストだけで疲弊する
  2. 不足選びを避ける —— 大規模サービスに軽量DBを使うと、成長した時に詰まる
  3. 両方を組み合わせる —— 現実のサービスは**RDB + キャッシュ層(Redis)**等の組み合わせが普通

面接・実務での意味

「データベース、何を使っていますか? なぜそれを選んだのですか?」

この質問は、単に「名前を言えるか」でなく**「選んだ理由を説明できるか」を聞いています。「規模が小さいので SQLite で運用コストを抑えた」「同時書き込みが多い本番なので PostgreSQL にした」と理由付きで選べる**人が、現場で信頼されます。

💡 ORM(オーアールエム/Object-Relational Mapping/オブジェクト関係マッピング): プログラムのコードとデータベースの間を橋渡しし、SQL を直接書かずにデータ操作できる仕組み。RDB の操作を書きやすくする定番の道具です。ただし「ORM を通すと何が起きているか」を理解しておかないと、遅いクエリを生むことがある点に注意。


7. よくある落とし穴と対処

落とし穴 何が起きるか 正しい対応
最初から大規模向けを選ぶ 小規模なのに運用コストで疲弊する まずはSQLite 等の軽量版で始め、必要になったら移行を検討
SQLite を大規模同時書き込みに使う ロックが頻発して詰まる 同時書き込みが多い本番はサーバー型(PostgreSQL 等)へ
RDB に無理やり非構造化データを詰める 表が複雑化し、運用が破綻する 形が柔軟なデータはドキュメント型も検討
インデックスを貼らない 検索が遅い(全件走査になる) よく検索する列にインデックスを設定する
インデックスを貼りすぎる 今度は書き込みが遅くなる 検索速く=書き込み遅、のトレードオフを理解して最小限に
バックアップを怠る 障害・誤操作でデータが消えて戻せない 定期的なバックアップ復元確認を必ず仕組み化

💡 インデックスindex/「索引」): 本の巻末の「索引」と同じ仕組み。特定の列から高速にデータを見つけられるようにする仕組みです。ただし索引を作る・更新するコストもかかるため、「検索が速くなる=無条件で良い」ではありません。


まとめ

💡 次のステップ: データを「保存する」仕組みが見えました。次は、動いているシステムの状態を観察する作法です。第8章では、ログ・モニタリングにより「いま正常に動いているか・問題が起きているか」を把握する方法を扱います。