データベースとは?
データベースとは、プログラムがすばやく安全に検索、追加、変更、削除できるように、コンピュータ上に整理して保存されたデータの集まりです。PostgreSQL、MySQL、SQLite、MongoDBなどの、データベース管理システム(DBMS)と呼ばれるソフトウェアが管理します。
更新日: 2026年9月24日
Webサイトにログインするとき、サイトは何百万件もの中からあなたのアカウントを見つけ、パスワードを確認し、設定を読み込みます。しかもそれを数ミリ秒で行います。テキストファイルを開いて1行ずつ読んでいるわけではありません。SELECT * FROM users WHERE email = 'ana@example.com' のような要求をデータベースに送り、データベースはインデックスを使って目的の行に直接たどり着きます。本の巻末にある索引とよく似た仕組みです。
データベースの仕組み
2つの要素が協力して動いています。データベースは、決まった構造で整理されたデータです。データベース管理システム(DBMS)は、そのデータをファイルに保存し、一貫性を保ち、要求に答えるプログラムです。PostgreSQL、MySQL、SQLiteはDBMSで、あなたの顧客の一覧がデータベースです。
リレーショナルデータベースでは、データはテーブルに入っています。各テーブルには列(名前、国、ポイント)と行(ユーザー1人につき1行)があります。要求は次のステップを経て処理されます。
- プログラムがクエリを送ります。ふつうはSQL(Structured Query Language)で書かれています。
- DBMSはクエリを解析し、どう答えるかの計画を立てます。どのテーブルを読むか、インデックスを使ってほとんどの行を飛ばせるか、といったことです。
- DBMSは決まった大きさのページ単位でディスクからデータを読みます(SQLiteのデフォルトは4,096バイト、PostgreSQLは8 KB)。よく使うページはメモリに置いておきます。
- 行を絞り込み、並べ替え、組み合わせてから、結果を返します。
PythonにはSQLiteが付属しているので、ここで本物のデータベースを動かせます。
Kenji 340
Omar 340
Ana 120
users: 4 average points: 222.5
プログラムは、どう検索するかを一度も指示していません。ほしい結果を記述するだけで、それをどう手に入れるかはDBMSが決めます。これが、データベースに問い合わせることと、リストに対してループを書くことの大きな違いです。
データベースの種類
| 種類 | データの保存形式 | 例 | 主な用途 |
|---|---|---|---|
| リレーショナル(SQL) | キーで関連付けられた行と列のテーブル | PostgreSQL、MySQL、SQLite、Oracle、SQL Server | ユーザー、注文、支払い。ほとんどのアプリケーション |
| ドキュメント | JSONのようなドキュメント | MongoDB、Firestore、CouchDB | レコードごとに項目が異なるデータ |
| キーバリュー | 1つのキーで引く値 | Redis、DynamoDB | キャッシュ、セッション、カウンタ |
| ワイドカラム | 多数のサーバーに分散された、列を柔軟に持てる行 | Cassandra、HBase | 非常に大量の書き込み |
| グラフ | ノードとノード間の関係 | Neo4j | ソーシャルネットワーク、レコメンド |
| 時系列 | 時刻でインデックスされた測定値 | InfluxDB、TimescaleDB | メトリクス、センサーの読み取り値 |
| ベクトル | 数値のリスト(埋め込み) | pgvector、Pinecone、Milvus | AI機能のための類似検索 |
リレーショナルでないものは、よくNoSQLとまとめて呼ばれます。テーブル、制約、SQLで幅広い問題をうまく扱えるので、ほとんどのアプリケーションでは今でもリレーショナルデータベースが標準の選択肢です。複数の種類を組み合わせた製品も多く、PostgreSQLはJSONドキュメントを保存でき、pgvectorはそこにベクトル検索を追加します。
トランザクション: すべてか、無か
アナからベンにお金を移すには、2つの変更が必要です。ベンに足し、アナから引くことです。その間でプログラムがクラッシュすると、お金がどこからともなく現れてしまいます。トランザクションは変更をひとまとめにし、すべてが保存されるか、1つも保存されないかのどちらかにします。次の例では、2つ目の変更がルール(残高はゼロ未満になってはいけない)に違反するので、データベースは1つ目の変更も取り消します。
transfer 30 done
{'ana': 20, 'ben': 30}
transfer 40 failed: CHECK constraint failed: balance >= 0
{'ana': 20, 'ben': 30}
ベンの40は一度足されてから取り消されたので、合計はちゃんと合っています。リレーショナルデータベースは、トランザクションについてACIDと呼ばれる4つの性質を約束しています。原子性(すべてか無か)、一貫性(CHECK のようなルールが常に守られる)、独立性(同時にトランザクションを実行する2人のユーザーが、互いの途中の作業を見ない)、永続性(一度保存された変更は、クラッシュや停電があっても残る)です。
データベースとスプレッドシートとファイルの違い
| テキストファイルやCSVファイル | スプレッドシート | データベース | |
|---|---|---|---|
| サイズ | プログラムが読み込める分だけ | Excelでは1シートあたり1,048,576行 | 数十億行 |
| 同時に複数が書き込めるか | できない | 限られる | できる(ロックとトランザクションによる) |
| 1件のレコードを探す | ファイル全体を読む | フィルタや検索 | インデックスで引く |
| データのルール | なし | 任意の入力規則 | 型、制約、外部キー |
| 質問のしかた | 自分でコードを書く | 数式 | SQLまたはクエリAPI |
スプレッドシートは、1人が数千行を眺めるには良い道具です。複数のプログラムやユーザーが同時にデータを書き込むようになったり、データがルールに従う必要が出てきたりしたら、データベースが適切な道具です。
データベースはどのようにデータを守るのか
DBMSは、データファイルに手を加える前に、各変更をログに書き込みます(ログ先行書き込み、WAL)。そのため、クラッシュした後でも、終わっていなかった作業をやり直したり取り消したりできます。PostgreSQLは8 KBのページごとにチェックサムを保存でき、故障しかけたディスクが壊れたデータを返すと、チェックサムの失敗として報告します。ユーザーと権限によって、誰がどのテーブルを読んだり変更したりできるかが決まり、レプリケーションは別のサーバーにコピーを保ちます。また、プログラムはユーザーの入力を、上の例の ? のプレースホルダのようにパラメータとして渡さなければなりません。SQLの文字列に貼り付けてはいけません。そうするとSQLインジェクション攻撃が起きてしまいます。
よくある誤解
- 「SQLはデータベースだ」 SQLは言語です。PostgreSQL、MySQL、SQLiteは、その言語を理解するデータベースです。
- 「NoSQLはSQLをまったく使わないという意味だ」 この言葉はふつう「not only SQL」と読まれていて、CassandraのCQLのように、SQLによく似た問い合わせ言語を持つNoSQLデータベースもいくつもあります。
- 「データベースは必ず大きなサーバーだ」 SQLiteは、プログラムが直接開く1つのファイルで、サーバーはまったくありません。AndroidやiOSのすべてのスマートフォンの中で動いています。
- 「データベースに入れたデータは永遠に安全だ」 データベースが守ってくれるのはクラッシュからであって、誰かがうっかり
DELETEを実行することからではありません。バックアップはやはり必要です。
次に読むページ
SQLコースでは、最初の SELECT からクエリを学べます。次のステップはSQLiteのドキュメントで学べます。SQLiteとは、テーブルの作成、インデックス、SQLインジェクションの防ぎ方です。データがディスク上でどう並んでいるかを知るにはバイトとは何かを読んでください。壊れたページがどのように検出されるかはチェックサムで説明しています。