リレーショナルデータベースとは
一括採点では、生徒や採点結果などのデータを管理するために リレーショナルデータベースを使用しています。 この記事では、その基本概念を解説します。
なぜデータを保存する必要があるか
採点ソフトでは、生徒の情報、試験の設定、採点結果など、 多くのデータを保存しておく必要があります。 アプリを閉じても、次に開いたときに前回の続きから作業できなければ困ります。
データを保存する方法はいくつか考えられます。
| 保存方法 | 特徴 |
|---|---|
| JSONファイル | シンプルだが、大量データの検索が遅い |
| Excelファイル | 人間には見やすいが、プログラムからの操作に不向き |
| データベース | 複雑なデータを効率的に管理できる |
一括採点ではデータベースを採用しました。 その理由は、この後の説明で明らかになります。
データは表で管理する
データベースでは、データを表で管理します。 Excelの表を想像してください。
たとえば、3年1組に山田太郎さん、鈴木花子さん、田中次郎さんがいるとします。 これを表にすると、次のようになります。
| 生徒名 | 学籍番号 | 学級 |
|---|---|---|
| 山田太郎 | 001 | 3年1組 |
| 鈴木花子 | 002 | 3年1組 |
| 田中次郎 | 003 | 3年1組 |
1行が1人分のデータ、各列が「生徒名」「学籍番号」「学級」といった項目になります。 Excelで成績表を作るのと同じ感覚です。
表は分割した方が良い
では、すべてのデータを1つの大きな表にまとめればよいでしょうか? 先ほどの3年1組の例に、学級の情報(担任、教室)も追加してみましょう。
| 生徒名 | 学籍番号 | 学級名 | 担任 | 教室 |
|---|---|---|---|---|
| 山田太郎 | 001 | 3年1組 | 佐藤先生 | 301教室 |
| 鈴木花子 | 002 | 3年1組 | 佐藤先生 | 301教室 |
| 田中次郎 | 003 | 3年1組 | 佐藤先生 | 301教室 |
色がついている部分に注目してください。 「3年1組」「佐藤先生」「301教室」が3回繰り返されています。
3人だけなら問題なさそうですが、実際の学級には30人以上の生徒がいます。 すると「3年1組」「佐藤先生」「301教室」を30回も書くことになります。
さらに問題があります。担任が変わったらどうなるでしょうか?30件すべてのデータを「佐藤先生」から「高橋先生」に書き換える必要があります。 1件でも書き換え忘れると、データに矛盾が生じてしまいます。
この問題を解決するのが、表の分割です。
生徒テーブル
| 生徒名 | 学籍番号 | 学級ID |
|---|---|---|
| 山田太郎 | 001 | C001 |
| 鈴木花子 | 002 | C001 |
| 田中次郎 | 003 | C001 |
学級テーブル
| 学級ID | 学級名 | 担任 |
|---|---|---|
| C001 | 3年1組 | 佐藤先生 |
生徒テーブルの「学級ID」と、学級テーブルの「学級ID」が対応しています。 C001という番号を使って、生徒がどの学級に所属しているかを表現しています。
こうすることで、学級の情報は1箇所だけに保存されます。 担任が変わっても、学級テーブルの1行を修正するだけで済みます。 30人分の生徒データを書き換える必要はありません。
このように、複数の表を「ID」で関連付けて管理するデータベースをリレーショナルデータベースと呼びます。 「リレーション(Relation)= 関係」が名前の由来です。
一対多と多対多
テーブル間の関係には、一対多と多対多の2種類があります。 先ほどの生徒と学級の例で見てみましょう。
一対多の関係
先ほどの例では、生徒テーブルに「学級ID」を持たせていました。 これは一対多の関係です。
- 1つの学級には複数の生徒が所属する
- 1人の生徒は1つの学級にだけ所属する
「1対多」なので、「多」側(生徒)に「1」側(学級)のIDを持たせます。 生徒テーブルの「学級ID」のように、別のテーブルを参照するIDを外部キーと呼びます。 参照先である学級テーブルの「学級ID」は主キーです。
この設計は単純でわかりやすいのですが、1つ問題があります。生徒が複数の学級に所属する場合はどうすればよいのでしょうか?
たとえば、山田太郎さんが2年生のときは2年3組、 3年生になって3年1組に転籍したとします。 生徒テーブルの「学級ID」は1つしか持てないので、 過去の所属情報を保存できません。
多対多の関係
生徒が複数の学級に所属できるようにしたい。 これは多対多の関係です。
- 1つの学級には複数の生徒が所属する
- 1人の生徒は複数の学級に所属できる(転籍対応)
多対多の関係は、直接2つのテーブルを繋ぐことができません。 そこで中間テーブルを使います。
生徒テーブル
| 生徒ID | 生徒名 |
|---|---|
| S001 | 山田太郎 |
| S002 | 鈴木花子 |
所属テーブル(中間)
| 生徒ID | 学級ID |
|---|---|
| S001 | C001 |
| S001 | C002 |
| S002 | C002 |
学級テーブル
| 学級ID | 学級名 |
|---|---|
| C001 | 2年3組 |
| C002 | 3年1組 |
中間テーブル(所属テーブル)を見ると、山田太郎(S001)は 2年3組(C001)と3年1組(C002)の両方に所属していることがわかります。
中間テーブルは、生徒テーブルと学級テーブルの両方への外部キーを持っています。 1人の生徒が複数の学級に所属する場合は、中間テーブルに複数の行が作られます。
多対多の関係を中間テーブルで分解すると、 「生徒 → 所属」と「所属 → 学級」という2つの一対多の関係になります。 中間テーブルのおかげで、生徒の転籍履歴も正しく管理できるようになりました。
採点結果を保存してみよう
では、採点ソフトの本題である「採点結果」を保存する場合を考えてみましょう。 「山田太郎さんの問1の採点結果は○」という情報を保存したいとします。
先ほどと同じように、1つの表にまとめた場合と、 表を分割した場合を比較してみます。
| 生徒名 | 学籍番号 | 学級 | 問題 | 配点 | 結果 |
|---|---|---|---|---|---|
| 山田太郎 | 001 | 3年1組 | 問1 | 3 | ○ |
| 山田太郎 | 001 | 3年1組 | 問2 | 5 | × |
| 鈴木花子 | 002 | 3年1組 | 問1 | 3 | ○ |
「山田太郎」「001」「3年1組」が繰り返されています。 「問1」「配点3」も生徒ごとに繰り返されます。 30人×30問なら900行になり、同じ情報が大量に重複します。
採点結果テーブル
| 生徒ID | 設問ID | 結果 |
|---|---|---|
| S001 | Q001 | ○ |
| S001 | Q002 | × |
| S002 | Q001 | ○ |
生徒テーブル
| 生徒ID | 生徒名 | 学籍番号 |
|---|---|---|
| S001 | 山田太郎 | 001 |
| S002 | 鈴木花子 | 002 |
設問テーブル
| 設問ID | 問題名 | 配点 |
|---|---|---|
| Q001 | 問1 | 3 |
| Q002 | 問2 | 5 |
採点結果テーブルには「結果」だけを保存し、 生徒や設問の情報はIDで参照します。 生徒名が変わっても、生徒テーブルの1行を修正するだけで済みます。
これを図に表すと
採点結果テーブルは、生徒テーブルと設問テーブルの両方を参照しています。 「S001のQ001の結果は○」という情報から、 「山田太郎さんの問1は○」という完全な情報を組み立てられます。
用語の整理
ここまでの説明で使った概念を、データベースの用語で整理しておきましょう。
| 用語 | この記事での例 | 説明 |
|---|---|---|
| テーブル | 生徒テーブル、設問テーブル | データをまとめる表 |
| カラム(列) | 生徒名、学籍番号、配点 | データの項目 |
| レコード(行) | 山田太郎さんの行 | 1件分のデータ |
| 主キー | 生徒ID(S001)、設問ID(Q001) | 各レコードを一意に識別するID |
| 外部キー | 採点結果の「生徒ID」「設問ID」 | 別のテーブルを参照するID |
| リレーション | 採点結果 → 生徒、採点結果 → 設問 | テーブル間の関連 |
一括採点では、すべてのテーブルでUUID(Universally Unique Identifier)を 主キーとして使用しています。 たとえば、採点結果を保存するとき、新しく生成したUUIDを主キーとして保存します。
UUIDは36文字のランダムな文字列です。 約340澗(かん)通り、つまり340兆の1兆倍の1兆倍もの組み合わせがあるため、 世界中で使われているどのUUIDとも重複しないとされています。
一括採点での活用
ここまでの例では、生徒・学級・設問・採点結果の4つのテーブルを使いました。 実際の一括採点では、全部で50を超えるテーブルが複雑に関連しています。 リレーショナルデータベースの仕組みにより、 これらの関連を整理して管理できています。
リレーショナルデータベースは、複数のテーブルをIDで関連付けて管理する仕組みです。 表を分割することで、データの重複を避け、更新も楽になります。
一対多の関係は外部キーで、多対多の関係は中間テーブルで表現します。 一括採点では、生徒・学級・設問・採点結果など多数のテーブルをこの仕組みで管理しています。