🎯 このレッスンのゴール
- 関係データベースの「表・行・列」と、主キー・外部キーが分かる
- E-R図と正規化の考え方を、やさしくイメージできる
- 関係演算(選択・射影・結合)とSQLの役割をつかむ
- トランザクションのACID特性・排他制御・障害回復を説明できる
こんにちは、先生役の「モニタくん」です。データベースって聞くとむずかしそうですが、正体はきれいに整理された「表」。Excelの表をイメージすれば大丈夫。表の作り方から、たくさんの人が同時に使っても壊れないしくみまで、ゆっくり一緒に見ていきましょう。
データベースとDBMSの役割
データベース(DB)とは、たくさんのデータをあとから探したり・並べ替えたり・集計したりしやすいように整理してためておくしくみのことです。バラバラのメモではなく、決まった形にそろえて保存しておくのがポイントです。
そして、そのデータベースを管理するための専用ソフトをDBMS(データベース管理システム/Database Management System)といいます。DBMSは、データの追加・検索・更新・削除を引き受けるだけでなく、次のような大切な仕事をしてくれます。
- 同時実行制御:大勢が同時に使っても、データが混ざらないように調整する。
- 機密保護(アクセス権):誰がどのデータを見たり書き換えたりできるかを管理する。
- 障害回復:停電や故障が起きても、データを元に戻せるようにする。
- データの一貫性:矛盾したデータが入らないように見張る。
大量の本(データ)をただ積み上げただけでは、読みたい本を探せません。背番号をつけて棚に整理したものがデータベース。そして「この本ありますか?」に答えたり、貸出・返却を記録したり、貸出中の本がダブらないよう管理してくれる司書さんがDBMSです。利用者は司書さんにお願いするだけで、棚の細かいことを知らなくてOKです。
関係データベース(表・行・列)
いま最も広く使われているのが関係データベース(リレーショナルデータベース/RDB)です。データを表(テーブル)の形で管理するのが特徴で、表計算ソフトの表とそっくりです。用語をそろえておきましょう。
| 呼び方 | 別の言い方 | 意味 |
|---|---|---|
| 表(テーブル) | 関係(リレーション) | 同じ種類のデータを集めたもの。1つのテーマで1つの表。 |
| 行(レコード) | 組(タプル) | 1件分のデータ(例:生徒1人分)。横の1行。 |
| 列(フィールド) | 属性(アトリビュート) | 項目の種類(例:氏名・住所)。縦の1列。 |
たとえば「生徒」を管理する表は、次のようになります。横の1行が生徒1人(=レコード)、縦の各列が項目(=フィールド/属性)です。
| 学籍番号 | 氏名 | クラス | 電話番号 |
|---|---|---|---|
| 1001 | 佐藤 一郎 | A | 090-1111-1111 |
| 1002 | 鈴木 花子 | B | 090-2222-2222 |
| 1003 | 田中 三郎 | A | 090-3333-3333 |
関係データベースは「表の集まり」。1件分のデータが行(レコード)、項目の種類が列(フィールド/属性)。この対応をしっかり覚えると、以降の話がスッと入ります。
キー:主キーと外部キー
表の中から「この1行」を確実に取り出すための目印がキーです。試験で特に重要なのが、主キーと外部キーの2つです。
主キー(しゅキー/プライマリキー)
主キーは、1つの行を他と区別して特定するための列です。先ほどの表でいえば「学籍番号」がぴったり。主キーには次の3つの厳しいルールがあります。
| 主キーのルール | 意味 |
|---|---|
| 一意(ユニーク) | 表の中で値がただ1つに決まる。同じ値の行を1つに特定できる。 |
| 重複不可 | 同じ値が2つ以上あってはいけない(だから区別できる)。 |
| NULL不可(空欄禁止) | 値が空っぽ(NULL)であってはいけない。必ず何か値が入る。 |
同姓同名の人がいても、学籍番号が違えば別人だと確実に分かります。氏名は重複するかもしれないので主キーには向きません。「絶対にかぶらず・必ずあって・1人に決まる」番号こそ主キー。会員番号や社員番号も同じ役割です。
候補キー
主キーになれる資格(一意で重複しない)を持つ列を候補キーといいます。候補キーが複数あるときは、その中から1つを選んで主キーにします。たとえば「学籍番号」も「マイナンバー」もどちらも一意なら、両方が候補キーで、そのうち1つを主キーに決めるイメージです。
外部キー(がいぶキー/フォーリンキー)
外部キーは、別の表の主キーを参照する列です。表どうしをつなぐ「のりしろ」の役割をします。次の例では「成績」表の学籍番号が、「生徒」表の主キー(学籍番号)を参照する外部キーです。
| 成績表(学籍番号が外部キー) | ||
|---|---|---|
| 学籍番号 | 科目 | 点数 |
| 1001 | 国語 | 80 |
| 1001 | 数学 | 75 |
| 1002 | 国語 | 90 |
外部キーには、参照先の表に存在しない値を入れてはいけないというルール(参照整合性)があります。たとえば「生徒」表に居ない学籍番号「9999」を成績表に入れると、誰の点数か分からず矛盾します。DBMSはこうした矛盾を防いでくれます。
データベース設計:E-R図
表を作る前に、「どんなデータを・どう関連づけて管理するか」を整理する設計図が必要です。よく使われるのがE-R図(実体関連図/Entity-Relationship Diagram)です。
- 実体(エンティティ):管理したいモノやコト。例:「生徒」「科目」。表になる候補です。
- 関連(リレーションシップ):実体どうしのつながり。例:「生徒」が「科目」を履修する。
- 属性:実体が持つ項目。例:生徒の「氏名」「クラス」。
関連には、「1人の生徒が複数の科目を履修する」のような1対多や、「複数の生徒が複数の科目を履修する」多対多といった多重度(カーディナリティ)があります。多対多の関係は、間に「履修」のような表をはさんで整理します。
正規化(重複をなくす)
正規化とは、データの重複をなくし、更新したときの矛盾(不整合)を防ぐために、表を適切に分割していく作業です。なぜ必要なのか、ダメな例で見てみましょう。
下の表は、生徒情報とクラス担任を1つの表に詰め込んでいます。クラスAの担任が変わったとき、Aの行をすべて直さないと、古い担任と新しい担任が混在してしまいます(更新の手間とミスのもと)。これが「更新時の矛盾」です。
| 悪い例:重複が多い表 | ||
|---|---|---|
| 学籍番号 | クラス | 担任 |
| 1001 | A | 山田先生 |
| 1003 | A | 山田先生 |
| 1002 | B | 佐藤先生 |
そこで、表を「生徒」と「クラス」に分けると、担任の情報は1か所だけになります。担任が変わっても、クラス表の1行を直すだけで済みます。
| 生徒表 | |
|---|---|
| 学籍番号 | クラス |
| 1001 | A |
| 1003 | A |
| 1002 | B |
| クラス表 | |
|---|---|
| クラス | 担任 |
| A | 山田先生 |
| B | 佐藤先生 |
・重複が減る(同じ情報を何度も持たない)
・更新の矛盾を防ぐ(直す場所が1か所で済む)
・容量のムダが減る
つながりは外部キーで保てるので、分けても情報は失われません。
正規化で表を分けると、必要なデータを取り出すときに表を結合(後述)する手間が増え、検索が少し遅くなることがあります。そのため、わざと重複を残して速さを優先する設計(非正規化)が選ばれる場面もあります。ITパスポートでは「正規化=重複をなくし矛盾を防ぐ」という目的をおさえれば十分です。
関係演算(選択・射影・結合)
表から欲しいデータを取り出す操作を関係演算といいます。代表的な3つをおさえましょう。「行を取り出す/列を取り出す/表をつなぐ」と整理すると覚えやすいです。
| 演算 | 取り出すもの | イメージ |
|---|---|---|
| 選択(せんたく) | 行を取り出す | 条件に合う行だけを抜き出す(例:クラスAの生徒だけ)。横方向の絞り込み。 |
| 射影(しゃえい) | 列を取り出す | 必要な列だけを抜き出す(例:氏名と電話番号だけ)。縦方向の絞り込み。 |
| 結合(けつごう) | 複数の表をつなぐ | 共通の列(例:学籍番号)をかぎに、2つの表を1つに合わせる。 |
大きな表をハサミで切るイメージです。選択は横にスパッと切って必要な行だけ残す。射影は縦にスパッと切って必要な列だけ残す。結合は、分けておいた「生徒表」と「成績表」を学籍番号でくっつけて、1枚の見やすい表に戻す作業です。
SQLのイメージ
関係データベースを操作するための言語がSQL(エスキューエル)です。中でもSELECT文は、表からデータを検索・抽出・並べ替えする命令で、いちばんよく使われます。細かい文法を暗記する必要はありませんが、ざっくりした形と役割をイメージしておきましょう。
| キーワード | 役割 |
|---|---|
| SELECT 列名 | 取り出す列を指定する(=射影に対応) |
| FROM 表名 | どの表から取り出すかを指定する |
| WHERE 条件 | 条件に合う行だけに絞る(=選択に対応) |
| ORDER BY 列名 | 結果を並べ替える(昇順・降順) |
SELECT 氏名, 電話番号 FROM 生徒 WHERE クラス = 'A'
これは「生徒表(FROM)から、クラスがAの行だけ(WHERE=選択)を取り出し、その氏名と電話番号(SELECT=射影)を表示せよ」という意味。最後に ORDER BY 氏名 をつければ、氏名の順に並べ替えられます。
トランザクションとACID特性
トランザクションとは、「これ以上分けられない、ひとまとまりの一連の処理」のことです。たとえば銀行振込は「Aさんの口座から1万円減らす」と「Bさんの口座に1万円増やす」の2つで1セット。片方だけ成功して片方が失敗したら、お金が消えたり増えたりして大変です。だから「全部成功」か「全部なかったこと」にする必要があります。
このトランザクションが守るべき4つの性質を、頭文字をとってACID(アシッド)特性といいます。試験頻出です。
| 頭文字 | 特性(日本語) | 意味 |
|---|---|---|
| A | 原子性(Atomicity) | 処理は「全部実行」か「全部取り消し」のどちらか。中途半端を許さない。 |
| C | 一貫性(Consistency) | 処理の前後で、データの矛盾やルール違反が起きない。 |
| I | 独立性/隔離性(Isolation) | 同時に動く複数の処理が、互いにじゃまをしない(途中経過が見えない)。 |
| D | 耐久性(Durability) | 正常に完了した結果は、障害が起きても失われず残る。 |
・コミット(commit):トランザクションを正常に確定して、変更を本当に反映すること。
・ロールバック(rollback):途中で失敗したとき、変更を取り消して元の状態に戻すこと。
原子性(A)は、この「コミットかロールバックか」で守られています。
振込の途中で停電しても、「Aから減らした」だけで終わらせてはいけません。DBMSはロールバックで振込前に巻き戻し、なかったことにします。逆に両方ぶじ終わればコミットして確定。だからお金が消えも増えもしないのです。
排他制御(ロックとデッドロック)
大勢が同時に同じデータを書き換えると、結果がおかしくなることがあります。これを防ぐのが排他制御(同時実行制御)で、その代表的な方法がロックです。
- ロック:あるデータを使っている間、他の人がさわれないように「使用中」のかぎをかけること。終わったら解除します。
- 共有ロック:「読むだけ」なら複数人が同時にかけてよいロック。
- 専有(排他)ロック:「書き換える」ときにかける、自分以外を締め出すロック。
デッドロックとは、2つの処理が互いに相手が持つデータのロック解除を待ち続け、どちらも動けなくなる状態です。AさんはデータXを確保してYを待ち、BさんはYを確保してXを待つ――こうなると永遠に進みません。DBMSはこれを検知して、片方の処理を強制的にロールバックして解消します。
障害回復(ログ・バックアップ)
停電・故障・操作ミスでデータが壊れても、DBMSは元に戻せるしくみを持っています。かなめになるのが、変更の履歴を記録したログ(ジャーナル)と、定期的に丸ごと保存しておくバックアップです。
| 方法 | どんなとき | やること |
|---|---|---|
| ロールバック | 処理が途中で失敗した | ログを使い、変更を前に戻して取り消す。 |
| ロールフォワード | 媒体(ディスク)が壊れた | バックアップを復元し、ログを使ってその後の更新をやり直す(前に進める)。 |
・ロールバック=後ろに戻す(失敗した処理を取り消す)。
・ロールフォワード=前に進める(バックアップ+ログで最新状態まで復旧)。
「バック=戻る/フォワード=進む」と方向で結びつけると混同しません。
分散データベースとNoSQLのさわり
最後に、発展的なキーワードを軽く押さえておきましょう。
- 分散データベース:データを複数のコンピュータ(拠点)に分けて保存し、全体で1つのデータベースのように扱うしくみ。負荷を分散でき、1か所が止まっても止まりにくいのが利点です。
- レプリケーション:同じデータの複製(コピー)を複数の場所に持ち、可用性(止まりにくさ)や読み取り性能を高める手法。
- NoSQL:関係データベース(表)以外の方式の総称。キー・バリュー型やドキュメント型などがあり、決まった表の形にとらわれず、大量データや多様なデータを高速に扱うのが得意です。SNSやビッグデータの保存などで使われます。
銀行の口座のように厳密な整合性が命のデータは、ACIDをきっちり守る関係データベースが向いています。一方、SNSの「いいね」数や閲覧ログのようにとにかく大量で速さが大事なデータは、NoSQLが選ばれやすいです。目的に合わせて使い分けます。
✏️ 確認テスト(全7問)
〇か×で答えてみましょう。ボタンを押すと答えと解説が出ます。
Q1. 関係データベースでは、1件分のデータを「行(レコード)」、項目の種類を「列(フィールド)」と呼ぶ。
正解は 〇。横の1行がレコード(組)、縦の1列がフィールド(属性)です。表=テーブルとあわせて覚えましょう。
Q2. 主キーには、値が空欄(NULL)でも構わない。
正解は ×。主キーは一意・重複不可・NULL不可。空欄では行を特定できないため、NULLは認められません。
Q3. 外部キーは、別の表の主キーを参照する列である。
正解は 〇。外部キーは表どうしをつなぐ列で、参照先(主キー)に存在しない値は入れられません(参照整合性)。
Q4. 正規化の主な目的は、データの重複をなくし、更新時の矛盾を防ぐことである。
正解は 〇。表を適切に分けて重複を減らし、直す場所を1か所にすることで不整合を防ぎます。
Q5. 関係演算の「射影」は、条件に合う行を取り出す操作である。
正解は ×。条件に合う行を取り出すのは「選択」です。「射影」は必要な列を取り出す操作です。
Q6. ACID特性の「原子性」とは、処理が全部実行されるか、全部取り消されるかのどちらかになる性質である。
正解は 〇。原子性(Atomicity)は「全部か無か」。これはコミット/ロールバックによって守られます。
Q7. ディスクが壊れたとき、バックアップとログで最新状態まで復旧する操作を「ロールバック」という。
正解は ×。それはロールフォワード(前に進める)です。ロールバックは失敗した処理を元に戻す操作です。
📝 一問一答(全8問)
Q1. データベースを管理する専用ソフトを何という?
Q2. 主キーが満たすべき3つの条件は?
Q3. 別の表の主キーを参照する列を何という?
Q4. データベース設計で、実体(エンティティ)と関連を表す図は?
Q5. 必要な「列」だけを取り出す関係演算は?
Q6. SQLで、表からデータを検索・抽出するときに使う代表的な命令は?
Q7. 互いに相手のロック解除を待ち続け、どちらも進めなくなる状態は?
Q8. 関係データベース以外の方式の総称で、大量・多様なデータを高速に扱うのが得意なものは?
このレッスンのまとめ
・関係データベースは表(テーブル)の集まり。行=レコード/列=フィールド(属性)。
・主キーは一意・重複不可・NULL不可。外部キーは別表の主キーを参照する。
・正規化は表を分けて重複をなくし、更新の矛盾を防ぐ。設計図はE-R図。
・関係演算は選択(行)・射影(列)・結合(つなぐ)。SQLのSELECTで検索・並べ替え。
・トランザクションは一連の処理。ACID特性を守り、コミット/ロールバックで確定・取消。
・ロックで排他制御(デッドロックに注意)。障害回復はロールバック/ロールフォワード。
データの「整理(表・キー・正規化)」と「安全(トランザクション・回復)」の両方がつかめれば、データベースは合格レベルです。次はそのデータをやり取りするネットワークへ進みましょう。