コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

データベースとは

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

データベースとは

このレッスンで分かること

  • データベースとファイル直書きの決定的な違い
  • DBMS が提供する 5 つの機能(永続化・検索・整合性・並行制御・障害回復)
  • なぜ自前ファイル管理を捨てて DB を使うのか

データベース とは

ファイルとデータベースの違い、なぜ DBMS が必要なのかを学ぶ。本レッスンでは、データベース の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

データベースの定義

データベース (Database) とは、複数のプログラムやユーザーから共有して使えるよう、構造化して保存されたデータの集合体のことです。それを管理するソフトウェアを DBMS (Database Management System) と呼びます。MySQL や PostgreSQL、TiDB、SQLite、MongoDB などが代表例です。

「単にデータを保存したいだけなら、CSV や JSON ファイルに書けばいいのでは」と思うかもしれません。実際、小さなツールなら fs.writeFileSync でも十分です。しかし規模が大きくなると、ファイル直書きでは破綻する問題が必ず出てきます。それを解決するために生まれたのが DBMS です。

ファイル直書きで起きる 5 つの問題

diagram (will load when visible)

1 つ目は 同時書き込みでの破損 です。複数のリクエストが同時に同じファイルを書こうとすると、後勝ち上書きや内容混在が起きます。 2 つ目は 検索の遅さ です。100 万行から 1 件を探すのに毎回全件読み込むと、CPU もディスクも持ちません。 3 つ目は アトミック性の欠如 です。書き込み途中でプロセスが落ちると、半分書かれた壊れたレコードが残ります。 4 つ目は 型の保証がない こと。JSON なら数値も文字列も同じファイルに混在し、バグの温床になります。 5 つ目は バックアップ・復旧の難しさ です。ファイルコピー中に書き込みが走ると整合性が壊れます。

DBMS が提供する 5 つの機能

これらすべてを解決するのが DBMS です。具体的には次の機能を提供します。

  • 永続化 (Persistence) — メモリ上のデータをディスクに確実に書き出す。クラッシュしても WALRedo Log から復旧できる。
  • インデックス検索B-tree などのデータ構造で 100 万行から 1 件を O(log n) で取り出せる。
  • 整合性制約PRIMARY KEYFOREIGN KEYCHECK 制約で不正なデータの混入を防ぐ。
  • 並行制御 (Concurrency Control)ロックMVCC で複数ユーザーの同時アクセスを安全に処理する。
  • トランザクションBEGIN から COMMIT までを 1 つの不可分な単位として扱い、途中失敗は ROLLBACK で巻き戻す。

自前ファイル管理 + ロック + WAL + B-tree + 制約 + クラッシュリカバリを全部書き直すと、それはもう DBMS の再実装です。

具体例で見る違い

ユーザー登録を考えます。ファイル直書きならこうです。

JavaScript

const users = JSON.parse(fs.readFileSync("users.json")); users.push({ id: Date.now(), email }); fs.writeFileSync("users.json", JSON.stringify(users));

このコードは同時に 2 リクエストが来ると、片方の追加が消えます。DBMS なら次のように書きます。

SQL クエリ

INSERT INTO users (email) VALUES ('alice@example.com');

DBMS は内部でロックと WAL を使い、何百並列でも一貫性を保ちます。UNIQUE 制約を付ければ重複登録も自動で弾けます。これがアプリケーション側のコードを劇的にシンプルにします。

トレードオフ

DBMS にもデメリットはあります。学習コスト が高く、インフラ費用 がかかり、スキーマ変更 に手間がかかります。設定ファイルや一時キャッシュ程度なら、ファイルや Redis の方が適切です。「永続性が必要か」「複数アクセスがあるか」「整合性が要るか」を基準に選びましょう。

やってみよう

  • SQLite をインストールし、CREATE TABLE users (id INTEGER PRIMARY KEY, email TEXT UNIQUE) を実行してみる
  • 同じメールアドレスを 2 回 INSERT して、UNIQUE 制約がどう働くか確認する
  • BEGIN の中で INSERT した後 ROLLBACK するとレコードが消える挙動を観察する

よくある質問

Q. RDB と NoSQL はどう使い分けますか?

A. 厳密な整合性と複雑な JOIN が必要なら RDB、スケーラビリティと柔軟なスキーマが必要なら NoSQL です。トランザクション処理(金融・予約)は RDB、ログ・SNS・タイムラインは NoSQL が向きます。MySQL/PostgreSQL は OLTP、MongoDB/DynamoDB は Web スケールの定番です。

Q. NoSQL のデメリットは?

A. JOIN が苦手で集計クエリも書きにくく、強整合性が保証されないことが多いです。データモデリングをアプリ側で工夫する必要があり、トランザクションの境界も自分で設計する必要があります。SQL の方が楽な場面が多いという認識は持っておきましょう。

Q. DB 選定で押さえるべき観点は?

A. 読み書き比率、整合性要件、データ量、レイテンシ要件、運用コスト、エンジニアの習熟度を見ます。多くのスタートアップは PostgreSQL から始めて、必要に応じて Redis / Elasticsearch を組み合わせる構成に落ち着きます。

次のレッスン

次は RDB と NoSQL の違い で、ファイルとデータベースの違い、なぜ DBMS が必要なのかを学ぶ を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. データベースとは の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. データベースとは とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン