すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

リレーショナルデータベースに関する用語を学ぼう

この記事で出来るようになること

はじめに

Ruby on Railsのモデルを学ぶ前に、まずは「リレーショナルデータベース」に関する用語について学びましょう。

初心者の方にも分かりやすいように、豊富な画像を用いて各用語のイメージを掴んでいただけるような構成を取り入れています。データベースの基本知識を習得することで、Railsを使用したデータベース操作の際に、何を行っているのかを理解しつつ進めることができます。

この章の目標
  • リレーショナルデータベース(RDB)の基本概念を理解し、データベース内のデータの構造と管理方法を学ぶ
  • テーブル、レコード、カラムの役割と重要性を把握し、それらの関連性とデータベース内での使われ方を理解する
  • 主キー(PRIMARY KEY)と外部キー(FOREIGN KEY)の概念を学び、リレーショナルデータベースでのデータ整合性の保持方法を理解する

データベース(DB)とは

データベースとは、システムやユーザーが扱うデータを1つの場所に集めたものです。
アプリケーションのデータを保存・蓄積して、必要なデータをすぐに取り出せるように整理されています。

データベースにはいくつか種類がありますが、データを表のような形で管理する「関係型データベース」が主流です。

データベースの種類

ぴっかちゃん

データベースの種類って色々あるんだね

関係型データベースは、「関係データベース」または「リレーショナルデータベース」と呼ばれるよ

ぴかわかさん

リレーショナルデータベース(RDB)

リレーショナルデータベース(RDB:Relational Database)とは、各データを表のような形で整理して、互いに関連付けて扱えるデータベースのことです。

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

関係データベースとも呼ばれますが、本カリキュラムでは基本的に「リレーショナルデータベース(RDB)」という呼び名を採用します。

データの管理方法

リレーショナルデータベースの中には、表のような形でデータを保存して管理します。

データの管理方法

基本的にデータの追加や削除は、行単位で行われます。行列で区切られた1マスに入るデータは1つです。

次のように行が集まることで、「表のような形」ができます。これをリレーショナルデータベースでは、「テーブル」と呼びます。

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

見た目は表のようですが、厳密には表とテーブルは同じものではありません。
それでは、リレーショナルデータベースのテーブルとは何かについて学びましょう。

ぴっかちゃん

ExcelやGoogleスプレッドシートの表計算ソフトと何が違うんだろう。

データベースは大量のデータを扱うことを前提として作られているけど、表計算ソフトはそうじゃないので、大量のデータ処理が苦手だよ。

ぴかわかさん

テーブルとは何か

テーブルとは、データを表のような形で格納する領域のことです。リレーショナルデータベースでデータを扱うには、テーブルを作成する必要があります。

テーブルは、共通点を持った行の集合です。例えば、次のように「社員」という共通点を持つ行が集まることで「社員テーブル」ができます。

テーブル

そして社員テーブルでは、横の並びになる1つの「行」は1人の「社員」を表現します。

このようにリレーショナルデータベースのテーブルは、「ある共通点を持った行の集まり」である必要があります。

次のように共通点のない行を集めたものはテーブルとは呼べないので注意しましょう。

二次元表

ぴっかちゃん

確かに!各行では「人・犬・猫」で統一性なくバラバラだよね。

RDBのテーブルに必要とされる条件は「ある共通点を持った行を集めること」だと覚えておこう!

ぴかわかさん
ポイント
  1. テーブルとは、データを表のような形で格納する領域のこと
  2. テーブルは「共通点を持った行の集合」である必要がある
  3. 行列で区切られた1マスに入るデータは、1つだけである

テーブルの構成要素

それでは、テーブルに関するいくつかの用語を整理していきましょう。

行と列

テーブルの「行」と「列」には、「レコード」と「カラム」という別名があります。

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

レコード(行)

レコードとは、リレーショナルデータベース内のテーブルに格納されたデータ1件分のことです。次のようにテーブルの中の横の並びになる1行がデータ1件分です。

レコード

データの追加や削除などは、基本的にレコード(行)単位で行います。

データ追加

カラム(列)

カラムとは、テーブルに格納されたデータを構成する各項目のことです。

次のようにテーブルの中の縦の並びになる列がカラムです。
社員ID・氏名・部署などの項目名(カラムにつけた名前)は、「カラム名」と呼ばれます。

カラム

本カリキュラムでは基本的に「行」を「レコード」、「列」を「カラム」という呼び名を採用します。

ポイント
  1. テーブルの「行」と「列」には、「レコード」と「カラム」という別名がある
  2. レコードとは、テーブルに格納されたデータ1件分のこと
  3. カラムとは、テーブルに格納されたデータを構成する各項目のこと

カラムには「データ型」と「制約」を指定することができます。

ぴかわかさん

データ型

データ型とは、テーブルに格納するデータの種類を限定するものです。テーブルにはカラムを定義しますが、カラムにどのようなデータを格納するかに応じて「データ型」を指定することができます。

データ型には、次のように「数値型」「文字列型」「日付型」などいくつか種類があります。カラムには、指定したデータ型に沿ったデータしか格納することができません。

データ型

各型の表は、MariaDB(MySQL)で利用できるデータ型の内容になっています。

数値型

INT型 記憶域:4バイト
格納できる範囲:-2147483648~2147483647
BIGINT型 記憶域:8バイト
格納できる範囲:-9223372036854775808~9223372036854775807

文字列型

VARCHAR型 説明:最大の文字数を指定する必要がある
TEXT型 説明:文字数を指定する必要はないが、扱えるサイズは限られる

日付型

DATE型 説明:日付を格納する
形式:'YYYY-MM-DD'
DATETIME型 説明:日付と時刻を格納する
形式:'YYYY-MM-DD hh:mm:ss'

制約

カラムにはデータ型以外にも制約を設定することができます。制約とはデータベースに格納するデータが満たさなければならない条件のことです。

データ型では、テーブルに格納する「データの種類を限定する」ことができましたが、制約を設定することで、値の重複や空欄を禁止するなどデータ型よりさらに細かく、想定外なデータの入力を防ぐことができます。

代表的な制約は、以下の通りです。

制約名 説明 制約法
非NULL制約(NOT NULL制約) 「値を設定(空にしない)しなければならない」 列制約
一意制約(UNIQUE制約) データが一意(重複しない)でなければならない 表制約
列制約

制約が設定されたカラムに制約違反のデータを格納しようとするとエラーが起きます。
それでは、上記の2つの制約をもう少し詳しくみていきましょう。

非NULL制約(NOT NULL制約)

データベースにデータを登録するときに、現時点で値がまだ不明という場合もあります。
このような場合にリレーショナルデータベースでは、データをNULL(空欄)という扱いにすることができます。

NULL自身はデータの値ではなく、値が何も入っていない状態を指します

NULL

事前にNULLにならない(値を必ず設定する)ことがわかっているカラムに対して、「非NULL制約」を設定すると、NULLを禁止することができます。

例えば、次のように「非NULL制約」が設定されている「部署」のカラムはNULLを許容しませんので、必ず値がセットされなければなりません。

非NULL制約

「非NULL制約」が設定されているカラムにNULL(値が何もない状態)のデータを挿入しようとすると、エラーが起きて登録することができないので注意してください。

非NULL制約を設定するカラムにNULLを挿入した場合

ポイント
  1. RDBでは、値が定まらない場合にNULLという扱いにすることができる
  2. NULLとは、値が何も入っていない状態を指す
  3. 非NULL制約を設定すると、NULLを禁止することができる

一意制約(UNIQUE制約)

一意制約とは、カラムの値の重複を禁止する制約のことです。カラムに「一意制約」を設定することで、そのカラムにはテーブル内で重複のない値を格納することができます。

例えば、次のように「一意制約」が設定されている「氏名」のカラムは値の重複を許容しないので、必ず値が一意でなければなりません。

「一意制約」が設定されているカラムに重複する値のデータを挿入しようとすると、エラーが起きて登録することができないので注意してください。

重複データを挿入する場合

ただし、NULLは「一意制約」の対象外なので、次のように「一意制約」が設定される部署のカラムでNULLが重複してもデータを登録することができます。

NULLの重複の場合

ここまでに「非NULL制約」と「一意制約」を学びましたが、これらの制約は1つのカラムだけではなく、複数のカラムに設定することができます。

1つのカラムに「非NULL制約」と「一意制約」を組み合わせて設定することもできます。

キー(KEY)

リレーショナルデータベースのテーブルには、キー(KEY)を設定することができます。

キー(KEY)とは、あるデータを特定するための鍵となるカラムのことです。キーの種類はいくつかありますが、その中でも特に「主キー」と「外部キー」が重要です。

主キー(PRIMARY KEY)

主キー(PK:PRIMARY KEY)とは、テーブルに格納されたレコードを一意に識別(1行に特定)するためのカラムのことで、大量のデータの中から目的のレコードを特定することができます。

多くの場合、主キーはテーブルに1つ存在します。

主キー

どのカラムでも主キーとして扱える訳ではありません。

主キーとして設定するカラムは、そのカラムの値がわかると、どのレコードか特定できる必要があります。上記のテーブルでは、社員IDのカラムが主キーとして適しています。

ぴっかちゃん

主キーとして氏名のカラムでもよさそうだけど、同じ名前の人がいる可能性があるもんね。

主キーに求められる条件として「内容が重複しないこと」と「内容が空にならないこと」の2点が挙げられるよ。

ぴかわかさん
主キー制約(PRIMARY KEY制約)

主キーとして適切なカラムに対して、主キー制約(PRIMARY KEY制約)を設定することで、重複と空欄(NULL)を禁止することができます。

主キー制約は、1つのテーブルに対して1つしか設定することができません。

主キー制約

「主キー制約」が設定されているカラムに重複やNULLのデータを挿入しようとすると、エラーが起きて登録することができないので注意してください。

主キー制約違反データ

ポイント
  1. 1つのテーブルに1つの「主キー」を設定することで、大量のデータの中から目的のレコードを特定できる
  2. 主キーとは、レコードを一意に識別できるように設定されるカラムのこと
  3. 条件として「内容が重複しないこと」と「内容が空にならないこと」がある

もう1つの重要なキーである「外部キー」を理解するためには、RDBの大きな特徴である「リレーションシップ」の知識が必要です。まずは、リレーションシップについて学んでいきましょう!

ぴかわかさん

リレーションシップ

リレーショナルデータベースは、「複数のテーブルをお互いに関連付けて扱える」という特色があります。この関連付けを「リレーションシップ」と呼びます。

次のように「社員テーブル」と「部署テーブル」をお互いに関連付けることができます。

リレーションシップ

社員テーブルと部署テーブルがお互いに関連付けされていることで、社員テーブルの部署IDから部署の情報を取得できるようになります。

例えば、次のように山田花子さんの部署IDから「開発部」の情報を取得できます。

テーブル同士の関連付け

ぴっかちゃん

テーブル同士を関連付けてデータを操作できることは何となくわかったけど、そもそも次の画像のようにテーブルを分けなきゃ良いんじゃない?

関連付けなしの場合

RDBでは、一般にデータ同士の関連を保ったままテーブルを分けて管理するよ!そうすると、データを変更するときに最小限の修正で済むんだよ。少し正規化について学んでみようか。

ぴかわかさん
正規化

データに重複や矛盾が生じないように、データ同士の関連を保ったまま表を分ける作業のことを「正規化」と呼びます。リレーショナルデータベースを利用するときには、データ間の整合性を保つために正規化を行います。

リレーションシップ

例えば「営業部」を今後増やす予定で、従来の営業部は「法人営業部」に変更するとします。次のように1つのテーブルに情報をまとめてしまうと、全ての「営業部」の箇所を「法人営業部」に修正する必要があります。

正規化されていないテーブルの修正

このときに1件でも修正漏れがあると、データ内容に矛盾が生じてしまいます。

しかし、1つのテーブルにまとまっていた情報を分けて、テーブル同士を関連付けることで、修正は1箇所で済みます。

正規化されるテーブルの修正

ぴっかちゃん

これだったら、修正漏れの心配がないよね!

あとは正規化されたテーブル同士を関連付けるために「外部キー」が必要で、データの一貫性や正当性を保つためには「外部キー制約」が必要だよ。次で詳しくみてみよう!

ぴかわかさん
ポイント
  1. リレーショナルデータベースは、各データをテーブルで整理して、互いに関連付けて扱えるデータベースの1種のこと
  2. この関連付けを「リレーションシップ」と呼ぶ
  3. 正規化とは、データに重複や矛盾が生じないように、データ同士の関連を保ったまま表を分ける作業のこと

外部キー(FOREIGN KEY)

テーブル同士の関連付けを行うために、他のテーブルの主キーを参照するカラムのことを外部キー(FK:FOREIGN KEY)と呼びます。

次のように社員テーブルの部署IDのカラムは、部署テーブルの主キーである部署IDのカラムを参照しています。この場合は社員テーブルの部署IDのカラムが「外部キー」になります。

外部キー

リレーショナルデータベースにおいて、データを参照される側のテーブルは「親」に当たり、データを参照する側のテーブルは「子」に当たります。つまり、関連付けられたテーブルは親子関係が成り立っています。

次のようにデータを参照される側の部署テーブルは「親」に当たり、データを参照する側の社員テーブルは「子」に当たります。

親子関係

参照される側のテーブルを「親テーブル」と呼び、参照する側のテーブルを「子テーブル」と呼びます。親子関係が成り立つテーブルのデータの一貫性や正当性を保つためには「外部キー制約」を設定する必要があります。

外部キー制約(FOREIGN KEY制約)

外部キーとして扱いたいカラムに対して、外部キー制約(FOREIGN KEY制約)を設定することで、親テーブルに存在しないデータが子テーブルに間違って登録されないように防止することができます。

次のように親である「部署テーブル」に存在しないデータを子である「社員テーブル」に登録されてしまうと、親テーブルと子テーブルの整合性が崩れてしまいます。

外部キー制約がない状態

上記のように社員テーブルの部署IDのカラムに3のデータを登録しても、部署テーブルには、そのデータが存在しないので参照することができません。

このような不整合の状態を防ぐために、「外部キー」として扱うカラムに対して外部キー制約を設定します。外部キー制約を設定することで、親テーブルに存在しないデータを子テーブルに登録しようとするとエラーになり、データの一貫性や正当性を保つことができます。

外部キー制約

ぴっかちゃん

親が存在しないと子は存在できないってことだね!

親テーブルのデータを削除する場合は、子テーブルにはどのような影響があるでしょうか。

次のように親である部署テーブルのレコードを削除すると、子の社員テーブルのデータの参照先がなくなることになります。親テーブルと子テーブルの整合性が崩れてしまいますね。

親テーブルのデータを削除する

整合性を保つために外部キー制約の設定では、2通りの対処方法があります。

親テーブルのデータを削除する際に同じキーを持つ子テーブルのデータもあわせて削除するか、そもそも親テーブルのデータを削除できないようにするかを選択することができます。

ポイント
  1. 外部キーとは、他のテーブルの主キーを参照するカラムのこと
  2. 参照される側のテーブルを「親テーブル」と呼び、参照する側のテーブルを「子テーブル」と呼ぶ
  3. 外部キー制約を設定することで、親テーブルに存在しないデータが子テーブルに間違って登録されないように防止できる

データベース管理システム(DBMS)

データベースの機能をアプリケーションから利用するには、データベース管理システム(DBMS:Database Management System)と呼ばれるソフトウェアが必要になります。

データベース管理システムとは、データベースの構築や管理を行うシステムのことです。

DBMS

データベースは「整理されたデータの集まり」のことです。データベースを利用したい側の指示により、データベース管理システムがデータベースに対する操作(データの追加など)を担当します。

データベース管理システムを利用することで、データベースを効率的かつ適切に管理することができます。

ぴかわかさん
ポイント
  1. データベースとは、整理されたデータの集まりのこと
  2. データベース管理システムは、「データベースを利用したい側」と「データベース」の間に入り、「データベースを利用したい側」の指示によって、データベースを操作する

リレーショナルデータベース管理システム(RDBMS)

リレーショナルデータデータベース(RDB)の場合は、リレーショナルデータベース管理システム(RDBMS:Relational DataBase Management System)と呼ばれるソフトウェアで制御されています。

リレーショナルデータベース管理システムには、次のように「MySQL」や「MariaDB」などのソフトウェアがあります。

関係データベース管理システム

Pikawakaのカリキュラムでは、「MariaDB」を利用しているよ。

ぴかわかさん
ぴっかちゃん

なるほど!だからRuby on Railsの開発環境を構築するときに「MariaDB」を導入したんだね。

データベースシステム

リレーショナルデータベースのデータとリレーショナルデータベース管理システム、それらに関するアプリケーションもまとめて「データベースシステム」と呼ばれます。

多くの場合は「データベースシステム」を単に「データベース」と呼びます。

データベース

データベース言語機能(SQL)

リレーショナルデータベース管理システムは、データベース言語機能を提供します。

RDBMSのデータベース言語として、SQLと呼ばれる言語が標準として普及しています。
SQLとは、「MySQL」や「MariaDB」などのRDBMSに指示を伝えるためのデータベース言語のことです。

ユーザーやアプリケーションなどの「データベースを利用する側」のSQL文(SQLで記述された命令文)の指示を受けて、RDBMSがリレーショナルデータベースを操作します。

データベース言語

SQLの書き方は後ほど学習しますが、例えば「生年月日が1983-01-01よりも後のレコードだけを抽出する」という命令を出して、データを抽出することができます。

レコードの抽出

データベースにはデータを溜め込むだけではなく、その溜め込んだデータを必要な形に整形して活用することができます。

用語の整理をしよう

最後にこれまで出てきた用語を整理しましょう。

用語 説明
データベース システムやユーザーが扱うデータを1つの場所に集めたもの
リレーショナルデータベース
(RDB:Relational Database)
各データを表のような形で整理して、互いに関連付けて扱えるデータベース
テーブル データを表のような形で格納する領域
レコード テーブルに格納されたデータ1件分
カラム テーブルに格納されたデータを構成する各項目
データ型 テーブルに格納するデータの種類を限定するもの
制約 データベースに格納するデータが満たさなければならない条件
NULL データの値ではなく、値が何も入っていない状態
非NULL制約
(NOT NULL制約)
NULLを禁止する制約
一意制約
(UNIQUE制約)
重複を禁止する制約
キー(KEY) あるデータを特定するための鍵となるカラム
主キー
(PK:PRIMARY KEY)
レコードを一意に識別(1行に特定)するためのカラム
主キー制約
(PRIMARY KEY制約)
重複やNULLを禁止する
リレーションシップ テーブル同士の関連付け
正規化 データに重複や矛盾が生じないように、データ同士の関連を保ったまま表を分ける作業
外部キー 他のテーブルの主キーを参照するカラム
外部キー制約
(FOREIGN KEY制約)
親テーブルに存在しないデータが子テーブルに登録されないようにする制約
データベース管理システム データベースの構築や管理を行うシステム
リレーショナルデータベース管理システム リレーショナルデータベースの構築や管理を行うシステムで、MySQLやMariaDBなどのソフトウェアがある
SQL リレーショナルデータベース管理システムに指示を伝えるためのデータベース言語
SQL文 SQLで記述された命令文

この章のまとめ

この章では、リレーショナルデータベース(RDB)の基本概念とその運用について学びました。RDBはデータを表形式で整理し、テーブル間で関連付けて扱うことができます。テーブル内のデータは行(レコード)と列(カラム)で構成されており、各カラムには特定のデータ型と制約を設定することが可能です。

データの整合性と一意性を保つために、主キー(PRIMARY KEY)と外部キー(FOREIGN KEY)が重要な役割を果たします。これらの知識は、データベースを効率的に管理し、適切に活用するために不可欠です。

この章のまとめ

  • リレーショナルデータベースは、「複数のテーブルをお互いに関連付けて扱える」という特色があるよ!
  • データ同士の関連を保ったままテーブルを分けて管理することで、データを変更するときに最小限の修正で済む