はじめに
プログラミングを勉強していると、以下のようなDB(データベース)用語をよく目にします。
- テーブル
- レコード
- カラム
- 主キー(PK)
- 外部キー(FK)
- SQL
- JOIN
- トランザクション
- インデックス
- マイグレーション
DB初心者の頃は、
「テーブルとレコードって何が違うの?」
「PKとFKって何?」
「JOINって何をしているの?」
「MigrationってDBとどう関係するの?」
と、用語だけではなかなかイメージしづらいと思います。
そこでこの記事では、**「受講生管理システム」**を例にして、DB関連の基本用語を初心者向けに整理します。
1. データベース(Database / DB)
データベースとは、システムで使用するデータを整理して保存しておく仕組みです。
受講生管理システムであれば、例えば以下のような情報を保存します。
- 受講生情報
- 講座情報
- 受講情報
- 講師情報
- 成績情報
イメージとしては、
DB = システム全体の大きなデータ保管庫
と考えると分かりやすいです。
2. DBMS
DBMSは、
Database Management System
の略です。
データベースを管理・操作するためのソフトウェアを指します。
代表的なDBMSには、以下があります。
- PostgreSQL
- MySQL
- Oracle Database
- SQL Server
例えば、受講生管理システムでPostgreSQLを使用している場合、
受講生管理システム
↓
PostgreSQL
↓
データ保存
という関係になります。
3. テーブル(Table)
テーブルとは、同じ種類のデータをまとめて保存する場所です。
例えば、受講生を管理するために students テーブルを作ります。
| id | name | age | |
|---|---|---|---|
| 1 | 山田太郎 | yamada@example.com | 20 |
| 2 | 佐藤花子 | sato@example.com | 22 |
また、講座を管理するために courses テーブルを作ります。
| id | name |
|---|---|
| 1 | Java基礎 |
| 2 | Ruby基礎 |
このように、データの種類ごとにテーブルを分けて管理します。
覚え方
テーブル = データを入れておく箱
Excelでいうと、1枚のシートに近いイメージです。
4. レコード(Record)
レコードとは、テーブルに保存されている1件分のデータです。
例えば、以下のテーブルがあるとします。
| id | name | |
|---|---|---|
| 1 | 山田太郎 | yamada@example.com |
| 2 | 佐藤花子 | sato@example.com |
この場合、
- 山田太郎 → 1レコード
- 佐藤花子 → 1レコード
です。
覚え方
レコード = データ1件
受講生管理システムなら、
レコード = 受講生1人分のデータ
と考えると分かりやすいです。
5. カラム(Column)
カラムとは、テーブルにあるデータの項目です。
例えば、
| id | name | age | |
|---|---|---|---|
| 1 | 山田太郎 | yamada@example.com | 20 |
この場合、
idnameemailage
がカラムです。
覚え方
カラム = データの項目
Excelでいうと、列にあたります。
例えば受講生であれば、
name → 名前
email → メールアドレス
age → 年齢
という関係です。
6. テーブル・レコード・カラムの違い
ここはDB初心者が特に混乱しやすいところです。
例えば、
students テーブル
┌────┬────────┬────────────────────┬─────┐
│ id │ name │ email │ age │
├────┼────────┼────────────────────┼─────┤
│ 1 │ 山田太郎 │ yamada@example.com │ 20 │
│ 2 │ 佐藤花子 │ sato@example.com │ 22 │
└────┴────────┴────────────────────┴─────┘
とすると、
| 用語 | 意味 |
|---|---|
| テーブル |
students 全体 |
| レコード | 山田太郎などの1行 |
| カラム |
id、name、email、ageなどの項目 |
となります。
7. 主キー(Primary Key / PK)
主キーとは、データを一意に識別するための値です。
例えば、
| id | name |
|---|---|
| 1 | 山田太郎 |
| 2 | 佐藤花子 |
| 3 | 鈴木一郎 |
というテーブルがあった場合、id が主キーです。
「山田太郎」という名前は、同姓同名の人がいる可能性があります。
しかし、
id = 1
という番号は1人だけに割り当てます。
覚え方
主キー = データを一意に識別するための番号
受講生管理システムなら、
受講生一人ひとりを識別するためのID
と考えると分かりやすいです。
8. 外部キー(Foreign Key / FK)
外部キーとは、別のテーブルのデータを参照するためのカラムです。
例えば、
students
| id | name |
|---|---|
| 1 | 山田太郎 |
| 2 | 佐藤花子 |
enrollments
| id | student_id | course_id |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 2 | 20 |
この場合、
enrollments.student_id
↓
students.id
という関係があります。
student_id = 1 なら、
「この受講情報は、studentsのid=1の山田太郎のもの」
と分かります。
覚え方
外部キー = 別のテーブルとつなぐためのID
です。
9. SQL
SQLとは、データベースに対して命令を出すための言語です。
例えば、
SELECT *
FROM students;
と書くと、
「studentsテーブルのデータを取得してください」
という意味になります。
SQLには、代表的な以下の命令があります。
| SQL | 意味 |
|---|---|
| SELECT | データを取得する |
| INSERT | データを追加する |
| UPDATE | データを更新する |
| DELETE | データを削除する |
10. SELECT
SELECTは、DBからデータを取得するためのSQLです。
SELECT *
FROM students;
これで、受講生を全員取得できます。
条件を指定することもできます。
SELECT *
FROM students
WHERE age >= 20;
これは、
「20歳以上の受講生を取得する」
という意味です。
覚え方
SELECT = データを取得する
11. INSERT
INSERTは、DBに新しいデータを追加するためのSQLです。
例えば、新しい受講生「田中一郎」を登録します。
INSERT INTO students (name)
VALUES ('田中一郎');
覚え方
INSERT = データを追加する
12. UPDATE
UPDATEは、DBに保存されているデータを変更するためのSQLです。
例えば、山田太郎さんのメールアドレスを変更します。
UPDATE students
SET email = 'new@example.com'
WHERE id = 1;
これは、
「idが1の受講生のメールアドレスを変更する」
という意味です。
覚え方
UPDATE = データを変更する
13. DELETE
DELETEは、DBからデータを削除するためのSQLです。
DELETE FROM students
WHERE id = 1;
これは、
「idが1の受講生を削除する」
という意味です。
覚え方
DELETE = データを削除する
14. WHERE
WHEREは、SQLで条件を指定するために使います。
例えば、
SELECT *
FROM students
WHERE age >= 20;
これは、
「20歳以上の受講生だけ取得する」
という意味です。
他にも、
WHERE id = 1
なら、
「IDが1の受講生」
という意味になります。
覚え方
WHERE = 「どのデータ?」を指定する
15. IN句
IN句は、複数の候補のどれかに一致するデータを取得するときに使います。
例えば、
SELECT *
FROM students
WHERE id IN (1, 3, 5);
これは、
「受講生IDが1、3、5のいずれかである受講生を取得する」
という意味です。
覚え方
IN = 「この中のどれか」
16. NULL
NULLとは、値が存在しない状態を表します。
例えば、
| id | name | phone |
|---|---|---|
| 1 | 山田太郎 | 090-1111-1111 |
| 2 | 佐藤花子 | NULL |
佐藤花子さんの電話番号が NULL なら、
「電話番号が登録されていない」
という意味です。
注意点として、NULLは、
0-
''(空文字)
とは異なります。
17. NOT NULL制約
NOT NULL制約とは、NULLを登録できないようにするルールです。
例えば、受講生の名前を必須項目にしたい場合、
name → NOT NULL
とします。
すると、
name = NULL
のデータは登録できません。
覚え方
NOT NULL = 必須項目
18. UNIQUE制約
UNIQUE制約とは、同じ値を重複して登録できないようにするルールです。
例えば、メールアドレスをUNIQUEにします。
yamada@example.com
というメールアドレスを2人の受講生に登録することができなくなります。
覚え方
UNIQUE = 重複禁止
19. 制約(Constraint)
制約とは、DBに登録するデータに対するルールです。
代表的な制約には以下があります。
| 制約 | 意味 |
|---|---|
| PRIMARY KEY | データを一意に識別する |
| FOREIGN KEY | 他のテーブルとの関係を保証する |
| NOT NULL | NULLを禁止する |
| UNIQUE | 重複を禁止する |
| CHECK | 条件に合わない値を禁止する |
覚え方
制約 = DBのデータを正しく保つためのルール
20. JOIN
JOINとは、複数のテーブルをつなげてデータを取得する機能です。
例えば、
students
| id | name |
|---|---|
| 1 | 山田太郎 |
| 2 | 佐藤花子 |
enrollments
| student_id | course_id |
|---|---|
| 1 | 10 |
| 2 | 20 |
courses
| id | name |
|---|---|
| 10 | Java基礎 |
| 20 | Ruby基礎 |
この3つのテーブルをJOINすると、
| 受講生 | 講座 |
|---|---|
| 山田太郎 | Java基礎 |
| 佐藤花子 | Ruby基礎 |
のようなデータを取得できます。
覚え方
JOIN = テーブル同士をつなぐ
21. インデックス(Index)
インデックスとは、データを高速に検索するための仕組みです。
例えば、受講生が100万人いるとします。
SELECT *
FROM students
WHERE email = 'yamada@example.com';
このような検索をするとき、email にインデックスを設定することで、検索を高速化できる場合があります。
イメージとしては、
Index = 本の巻末にある索引
です。
本を最初から全部読むより、索引を使って目的のページを探した方が速いですよね。
注意点
インデックスは多ければ多いほど良いわけではありません。
インデックスを作ると、検索は高速になる可能性がありますが、データの追加・更新時にインデックスの更新も必要になるため、適切に設計する必要があります。
22. トランザクション(Transaction)
トランザクションとは、複数のDB操作をひとまとまりの処理として扱う仕組みです。
例えば、受講生が講座に申し込む処理を考えます。
① 受講生を登録
↓
② 受講情報を登録
↓
③ 受講料を登録
もし②でエラーが発生した場合、
① 受講生だけ登録されている
② 受講情報は登録されていない
という不整合が発生してしまいます。
そこでトランザクションを使います。
① 受講生を登録
↓
② 受講情報を登録
↓
③ 受講料を登録
↓
全部成功?
↙ ↘
YES NO
↓ ↓
COMMIT ROLLBACK
つまり、
全部成功したら確定、途中で失敗したら全部取り消す
という仕組みです。
23. COMMIT
COMMITとは、トランザクションで行った変更を確定することです。
受講生登録
↓
受講情報登録
↓
受講料登録
↓
COMMIT
↓
すべて確定
覚え方
COMMIT = 確定
24. ROLLBACK
ROLLBACKとは、トランザクションで行った変更を取り消すことです。
受講生登録
↓
受講情報登録
↓
エラー発生
↓
ROLLBACK
↓
変更を取り消す
覚え方
ROLLBACK = 元に戻す
COMMITとセットで覚えると分かりやすいです。
COMMIT → 確定
ROLLBACK → 取り消し
25. リレーション(Relation)
リレーションとは、テーブル同士の関係のことです。
受講生管理システムでは、
students
↓
enrollments
↓
courses
のような関係があります。
例えば、
山田太郎さんはJava基礎を受講している
という情報を、テーブル同士の関係によって表現できます。
26. 1対1(1:1)
1つのデータに対して、別テーブルの1つのデータが対応する関係です。
例えば、
受講生
↓
プロフィール
「1人の受講生に1つのプロフィールがある」という関係です。
27. 1対多(1:N)
1つのデータに対して、複数のデータが対応する関係です。
例えば、
受講生
↓
受講履歴
↓
受講履歴
↓
受講履歴
山田太郎さんが、
- Java基礎
- Ruby基礎
- SQL基礎
の3つを受講している場合、
1人の受講生に対して複数の受講情報がある
ため、1対多の関係です。
Railsでは、例えば以下のように表現します。
class Student < ApplicationRecord
has_many :enrollments
end
class Enrollment < ApplicationRecord
belongs_to :student
end
28. 多対多(N:N)
多対多とは、複数のデータ同士が複数対応する関係です。
受講生管理システムでは、
受講生 ←→ 講座
が多対多になります。
なぜなら、
- 1人の受講生が複数の講座を受講できる
- 1つの講座を複数の受講生が受講できる
からです。
例えば、
山田さん → Java基礎
→ Ruby基礎
佐藤さん → Java基礎
→ SQL基礎
という状態です。
29. 中間テーブル
多対多の関係を管理するために使うのが中間テーブルです。
受講生管理システムなら、
students
courses
enrollments
という3つのテーブルを用意します。
この場合、enrollments が中間テーブルです。
| id | student_id | course_id |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 1 | 20 |
| 3 | 2 | 10 |
このデータから、
山田太郎 → Java基礎
山田太郎 → Ruby基礎
佐藤花子 → Java基礎
という関係が分かります。
覚え方
中間テーブル = 「誰が何を受講しているか」のような関係を管理するテーブル
30. Migration(マイグレーション)
Railsを使っている場合、Migrationは特に重要な用語です。
Migrationとは、DBの構造変更をコードとして管理する仕組みです。
例えば、
「受講生に電話番号を登録できるようにしたい」
となった場合、students テーブルに phone カラムを追加する必要があります。
RailsではMigrationを使って、
add_column :students, :phone, :string
のように記述します。
すると、
変更前
students
├── id
├── name
└── email
↓ Migration
変更後
students
├── id
├── name
├── email
└── phone
のようにDBの構造を変更できます。
覚え方
Migration = DBの構造を変更するための仕組み・変更履歴
Railsでは、DBの変更をコードとして残せるため、
- 誰が
- いつ
- どんな変更をしたか
を管理しやすくなります。
31. Schema(スキーマ)
Schemaとは、データベースの構造を表すものです。
例えば、
students
├── id
├── name
├── email
└── age
というテーブル構造や、
students
↓
enrollments
↓
courses
というテーブル同士の関係などが、DBのスキーマに関係します。
覚え方
Schema = DBの設計図
と考えると分かりやすいです。
32. Active Record
Railsを使っている場合、Active Recordも重要な用語です。
Active Recordとは、RailsからDBを操作するための仕組みです。
例えば、
Student.all
と書くと、students テーブルから受講生を取得できます。
また、
Student.find(1)
と書くと、IDが1の受講生を取得できます。
SQLを直接書かなくても、RubyのコードからDBを操作できます。
イメージとしては、
Ruby / Rails
↓
Active Record
↓
SQL
↓
Database
という関係です。
33. DB用語をまとめて整理
ここまでの用語を一覧にすると、以下のようになります。
| 用語 | 初心者向けの意味 |
|---|---|
| DB | データを保存する大きな保管庫 |
| DBMS | DBを管理するソフトウェア |
| テーブル | データを入れておく箱 |
| レコード | データ1件 |
| カラム | データの項目 |
| PK | データを一意に識別するID |
| FK | 他のテーブルとつなぐID |
| SQL | DBを操作する言語 |
| SELECT | データを取得する |
| INSERT | データを追加する |
| UPDATE | データを変更する |
| DELETE | データを削除する |
| WHERE | 条件を指定する |
| IN | 複数の候補から選ぶ |
| NULL | 値が存在しない |
| NOT NULL | NULLを禁止する |
| UNIQUE | 重複を禁止する |
| Constraint | データを守るためのルール |
| JOIN | テーブル同士をつなぐ |
| Index | 検索を高速化する仕組み |
| Transaction | 複数の処理をひとまとまりにする |
| COMMIT | 変更を確定する |
| ROLLBACK | 変更を取り消す |
| Relation | テーブル同士の関係 |
| 1:1 | 1対1の関係 |
| 1:N | 1対多の関係 |
| N:N | 多対多の関係 |
| 中間テーブル | 多対多の関係を管理するテーブル |
| Migration | DBの構造変更を管理する仕組み |
| Schema | DBの構造・設計図 |
| Active Record | RailsからDBを操作する仕組み |
34. 最初に覚えたい15個
DB初心者の場合、最初からすべて覚える必要はありません。
まずは以下の15個を覚えることをおすすめします。
① DB
データを保存する場所。
② テーブル
データを種類ごとに保存する場所。
③ レコード
データ1件。
④ カラム
データの項目。
⑤ PK
データを一意に識別するもの。
⑥ FK
他のテーブルとつなぐためのもの。
⑦ SQL
DBを操作する言語。
⑧ SELECT
データを取得する。
⑨ INSERT
データを追加する。
⑩ UPDATE
データを更新する。
⑪ DELETE
データを削除する。
⑫ JOIN
テーブル同士をつなぐ。
⑬ Index
検索を高速化する。
⑭ Transaction
複数のDB操作をひとまとまりにする。
⑮ Migration
DBの構造変更をコードで管理する。
まとめ
DB用語は、単語だけで覚えようとすると分かりにくいですが、受講生管理システムのような具体的なシステムに当てはめると理解しやすくなります。
全体像としては、まず、
データベース
↓
テーブル
↓
レコード
↓
カラム
という構造を理解します。
そしてテーブル同士を、
PK
↓
FK
↓
リレーション
↓
JOIN
によって関連付けます。
さらにDBを操作するために、
SELECT → 取得
INSERT → 追加
UPDATE → 更新
DELETE → 削除
というSQLを使用します。
Railsを使う場合は、さらに、
Migration → DBの構造を変更
Active Record → RailsからDBを操作
Transaction → DB操作を安全にまとめる
という知識が重要になります。
まずは、
「テーブル・レコード・カラム」
の違いを理解するところから始めると、DBの学習がかなり進めやすくなります。