コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
データベースとは
データベースとは
このレッスンで分かること
- データベースとファイル直書きの決定的な違い
- DBMS が提供する 5 つの機能(永続化・検索・整合性・並行制御・障害回復)
- なぜ自前ファイル管理を捨てて DB を使うのか
データベース とは
ファイルとデータベースの違い、なぜ DBMS が必要なのかを学ぶ。本レッスンでは、データベース の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
データベースの定義
データベース (Database) とは、複数のプログラムやユーザーから共有して使えるよう、構造化して保存されたデータの集合体のことです。それを管理するソフトウェアを DBMS (Database Management System) と呼びます。MySQL や PostgreSQL、TiDB、SQLite、MongoDB などが代表例です。
「単にデータを保存したいだけなら、CSV や JSON ファイルに書けばいいのでは」と思うかもしれません。実際、小さなツールなら fs.writeFileSync でも十分です。しかし規模が大きくなると、ファイル直書きでは破綻する問題が必ず出てきます。それを解決するために生まれたのが DBMS です。
ファイル直書きで起きる 5 つの問題
1 つ目は 同時書き込みでの破損 です。複数のリクエストが同時に同じファイルを書こうとすると、後勝ち上書きや内容混在が起きます。 2 つ目は 検索の遅さ です。100 万行から 1 件を探すのに毎回全件読み込むと、CPU もディスクも持ちません。 3 つ目は アトミック性の欠如 です。書き込み途中でプロセスが落ちると、半分書かれた壊れたレコードが残ります。 4 つ目は 型の保証がない こと。JSON なら数値も文字列も同じファイルに混在し、バグの温床になります。 5 つ目は バックアップ・復旧の難しさ です。ファイルコピー中に書き込みが走ると整合性が壊れます。
DBMS が提供する 5 つの機能
これらすべてを解決するのが DBMS です。具体的には次の機能を提供します。
- 永続化 (Persistence) — メモリ上のデータをディスクに確実に書き出す。クラッシュしても
WALやRedo Logから復旧できる。 - インデックス検索 —
B-treeなどのデータ構造で 100 万行から 1 件をO(log n)で取り出せる。 - 整合性制約 —
PRIMARY KEYやFOREIGN KEY、CHECK制約で不正なデータの混入を防ぐ。 - 並行制御 (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 つができることを確認しましょう。
- データベースとは の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. データベースとは とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン