開発ブログ一覧に戻る
しくみ解説2026年1月6日

リレーショナルデータベースとは

一括採点では、生徒や採点結果などのデータを管理するために リレーショナルデータベースを使用しています。 この記事では、その基本概念を解説します。

なぜデータを保存する必要があるか

採点ソフトでは、生徒の情報、試験の設定、採点結果など、 多くのデータを保存しておく必要があります。 アプリを閉じても、次に開いたときに前回の続きから作業できなければ困ります。

データを保存する方法はいくつか考えられます。

保存方法特徴
JSONファイルシンプルだが、大量データの検索が遅い
Excelファイル人間には見やすいが、プログラムからの操作に不向き
データベース複雑なデータを効率的に管理できる

一括採点ではデータベースを採用しました。 その理由は、この後の説明で明らかになります。

データは表で管理する

データベースでは、データをで管理します。 Excelの表を想像してください。

たとえば、3年1組に山田太郎さん、鈴木花子さん、田中次郎さんがいるとします。 これを表にすると、次のようになります。

生徒名学籍番号学級
山田太郎0013年1組
鈴木花子0023年1組
田中次郎0033年1組

1行が1人分のデータ、各列が「生徒名」「学籍番号」「学級」といった項目になります。 Excelで成績表を作るのと同じ感覚です。

表は分割した方が良い

では、すべてのデータを1つの大きな表にまとめればよいでしょうか? 先ほどの3年1組の例に、学級の情報(担任、教室)も追加してみましょう。

1つの表にまとめた場合
生徒名学籍番号学級名担任教室
山田太郎0013年1組佐藤先生301教室
鈴木花子0023年1組佐藤先生301教室
田中次郎0033年1組佐藤先生301教室

色がついている部分に注目してください。 「3年1組」「佐藤先生」「301教室」が3回繰り返されています。

3人だけなら問題なさそうですが、実際の学級には30人以上の生徒がいます。 すると「3年1組」「佐藤先生」「301教室」を30回も書くことになります。

さらに問題があります。担任が変わったらどうなるでしょうか?30件すべてのデータを「佐藤先生」から「高橋先生」に書き換える必要があります。 1件でも書き換え忘れると、データに矛盾が生じてしまいます。

この問題を解決するのが、表の分割です。

表を分割した場合

生徒テーブル

生徒名学籍番号学級ID
山田太郎001C001
鈴木花子002C001
田中次郎003C001

学級テーブル

学級ID学級名担任
C0013年1組佐藤先生

生徒テーブルの「学級ID」と、学級テーブルの「学級ID」が対応しています。 C001という番号を使って、生徒がどの学級に所属しているかを表現しています。

こうすることで、学級の情報は1箇所だけに保存されます。 担任が変わっても、学級テーブルの1行を修正するだけで済みます。 30人分の生徒データを書き換える必要はありません。

このように、複数の表を「ID」で関連付けて管理するデータベースをリレーショナルデータベースと呼びます。 「リレーション(Relation)= 関係」が名前の由来です。

一対多と多対多

テーブル間の関係には、一対多多対多の2種類があります。 先ほどの生徒と学級の例で見てみましょう。

一対多の関係

先ほどの例では、生徒テーブルに「学級ID」を持たせていました。 これは一対多の関係です。

一対多の例:学級と生徒
  • 1つの学級には複数の生徒が所属する
  • 1人の生徒は1つの学級にだけ所属する

「1対多」なので、「多」側(生徒)に「1」側(学級)のIDを持たせます。 生徒テーブルの「学級ID」のように、別のテーブルを参照するIDを外部キーと呼びます。 参照先である学級テーブルの「学級ID」は主キーです。

学級テーブル3年1組生徒テーブル山田太郎鈴木花子田中次郎...1 : 多

この設計は単純でわかりやすいのですが、1つ問題があります。生徒が複数の学級に所属する場合はどうすればよいのでしょうか?

たとえば、山田太郎さんが2年生のときは2年3組、 3年生になって3年1組に転籍したとします。 生徒テーブルの「学級ID」は1つしか持てないので、 過去の所属情報を保存できません。

多対多の関係

生徒が複数の学級に所属できるようにしたい。 これは多対多の関係です。

多対多の例:学級と生徒
  • 1つの学級には複数の生徒が所属する
  • 1人の生徒は複数の学級に所属できる(転籍対応)

多対多の関係は、直接2つのテーブルを繋ぐことができません。 そこで中間テーブルを使います。

中間テーブルを使った設計

生徒テーブル

生徒ID生徒名
S001山田太郎
S002鈴木花子

所属テーブル(中間)

生徒ID学級ID
S001C001
S001C002
S002C002

学級テーブル

学級ID学級名
C0012年3組
C0023年1組

中間テーブル(所属テーブル)を見ると、山田太郎(S001)は 2年3組(C001)と3年1組(C002)の両方に所属していることがわかります。

中間テーブルは、生徒テーブルと学級テーブルの両方への外部キーを持っています。 1人の生徒が複数の学級に所属する場合は、中間テーブルに複数の行が作られます。

生徒山田、鈴木...所属(中間)生徒ID + 学級ID学級2年3組、3年1組...

多対多の関係を中間テーブルで分解すると、 「生徒 → 所属」と「所属 → 学級」という2つの一対多の関係になります。 中間テーブルのおかげで、生徒の転籍履歴も正しく管理できるようになりました。

採点結果を保存してみよう

では、採点ソフトの本題である「採点結果」を保存する場合を考えてみましょう。 「山田太郎さんの問1の採点結果は○」という情報を保存したいとします。

先ほどと同じように、1つの表にまとめた場合と、 表を分割した場合を比較してみます。

1つの表にまとめた場合
生徒名学籍番号学級問題配点結果
山田太郎0013年1組問13
山田太郎0013年1組問25×
鈴木花子0023年1組問13

「山田太郎」「001」「3年1組」が繰り返されています。 「問1」「配点3」も生徒ごとに繰り返されます。 30人×30問なら900行になり、同じ情報が大量に重複します。

表を分割した場合

採点結果テーブル

生徒ID設問ID結果
S001Q001
S001Q002×
S002Q001

生徒テーブル

生徒ID生徒名学籍番号
S001山田太郎001
S002鈴木花子002

設問テーブル

設問ID問題名配点
Q001問13
Q002問25

採点結果テーブルには「結果」だけを保存し、 生徒や設問の情報はIDで参照します。 生徒名が変わっても、生徒テーブルの1行を修正するだけで済みます。

これを図に表すと

採点結果テーブル生徒ID: S001設問ID: Q001結果: ○生徒テーブル生徒ID: S001生徒名: 山田太郎学籍番号: 001設問テーブル設問ID: Q001問題名: 問1配点: 3矢印はIDによる参照を示します採点結果の「S001」→ 生徒テーブルの「山田太郎」採点結果の「Q001」→ 設問テーブルの「問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で関連付けて管理する仕組みです。 表を分割することで、データの重複を避け、更新も楽になります。

一対多の関係は外部キーで、多対多の関係は中間テーブルで表現します。 一括採点では、生徒・学級・設問・採点結果など多数のテーブルをこの仕組みで管理しています。

一括採点を使ってみませんか?

最新版をダウンロードして、採点作業を効率化しましょう。

最新版をダウンロード

一括採点

中学校の先生が、全国の先生のために作った、採点ツール。

© 2023-2026 KeppyNaushika. AGPLv3 オープンソースソフトウェアとして開発しています。