はじめに
Ruby on Railsのモデルを学ぶ前に、まずは「リレーショナルデータベース」に関する用語について学びましょう。
初心者の方にも分かりやすいように、豊富な画像を用いて各用語のイメージを掴んでいただけるような構成を取り入れています。データベースの基本知識を習得することで、Railsを使用したデータベース操作の際に、何を行っているのかを理解しつつ進めることができます。
- リレーショナルデータベース(RDB)の基本概念を理解し、データベース内のデータの構造と管理方法を学ぶ
- テーブル、レコード、カラムの役割と重要性を把握し、それらの関連性とデータベース内での使われ方を理解する
- 主キー(PRIMARY KEY)と外部キー(FOREIGN KEY)の概念を学び、リレーショナルデータベースでのデータ整合性の保持方法を理解する
データベース(DB)とは
データベースとは、システムやユーザーが扱うデータを1つの場所に集めたものです。
アプリケーションのデータを保存・蓄積して、必要なデータをすぐに取り出せるように整理されています。
データベースにはいくつか種類がありますが、データを表のような形で管理する「関係型データベース」が主流です。
データベースの種類って色々あるんだね
関係型データベースは、「関係データベース」または「リレーショナルデータベース」と呼ばれるよ
リレーショナルデータベース(RDB)
リレーショナルデータベース(RDB:Relational Database)とは、各データを表のような形で整理して、互いに関連付けて扱えるデータベースのことです。
関係データベースとも呼ばれますが、本カリキュラムでは基本的に「リレーショナルデータベース(RDB)」という呼び名を採用します。
データの管理方法
リレーショナルデータベースの中には、表のような形でデータを保存して管理します。
基本的にデータの追加や削除は、行単位で行われます。行列で区切られた1マスに入るデータは1つです。
次のように行が集まることで、「表のような形」ができます。これをリレーショナルデータベースでは、「テーブル」と呼びます。
見た目は表のようですが、厳密には表とテーブルは同じものではありません。
それでは、リレーショナルデータベースのテーブルとは何かについて学びましょう。
ExcelやGoogleスプレッドシートの表計算ソフトと何が違うんだろう。
データベースは大量のデータを扱うことを前提として作られているけど、表計算ソフトはそうじゃないので、大量のデータ処理が苦手だよ。
テーブルとは何か
テーブルとは、データを表のような形で格納する領域のことです。リレーショナルデータベースでデータを扱うには、テーブルを作成する必要があります。
テーブルは、共通点を持った行の集合です。例えば、次のように「社員」という共通点を持つ行が集まることで「社員テーブル」ができます。
そして社員テーブルでは、横の並びになる1つの「行」は1人の「社員」を表現します。
このようにリレーショナルデータベースのテーブルは、「ある共通点を持った行の集まり」である必要があります。
次のように共通点のない行を集めたものはテーブルとは呼べないので注意しましょう。
確かに!各行では「人・犬・猫」で統一性なくバラバラだよね。
RDBのテーブルに必要とされる条件は「ある共通点を持った行を集めること」だと覚えておこう!
テーブルの構成要素
それでは、テーブルに関するいくつかの用語を整理していきましょう。
行と列
テーブルの「行」と「列」には、「レコード」と「カラム」という別名があります。
レコード(行)
レコードとは、リレーショナルデータベース内のテーブルに格納されたデータ1件分のことです。次のようにテーブルの中の横の並びになる1行がデータ1件分です。
データの追加や削除などは、基本的にレコード(行)単位で行います。
カラム(列)
カラムとは、テーブルに格納されたデータを構成する各項目のことです。
次のようにテーブルの中の縦の並びになる列がカラムです。
社員ID・氏名・部署などの項目名(カラムにつけた名前)は、「カラム名」と呼ばれます。
本カリキュラムでは基本的に「行」を「レコード」、「列」を「カラム」という呼び名を採用します。
カラムには「データ型」と「制約」を指定することができます。
データ型
データ型とは、テーブルに格納するデータの種類を限定するものです。テーブルにはカラムを定義しますが、カラムにどのようなデータを格納するかに応じて「データ型」を指定することができます。
データ型には、次のように「数値型」「文字列型」「日付型」などいくつか種類があります。カラムには、指定したデータ型に沿ったデータしか格納することができません。
各型の表は、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(値が何もない状態)のデータを挿入しようとすると、エラーが起きて登録することができないので注意してください。
一意制約(UNIQUE制約)
一意制約とは、カラムの値の重複を禁止する制約のことです。カラムに「一意制約」を設定することで、そのカラムにはテーブル内で重複のない値を格納することができます。
例えば、次のように「一意制約」が設定されている「氏名」のカラムは値の重複を許容しないので、必ず値が一意でなければなりません。
「一意制約」が設定されているカラムに重複する値のデータを挿入しようとすると、エラーが起きて登録することができないので注意してください。
ただし、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つの重要なキーである「外部キー」を理解するためには、RDBの大きな特徴である「リレーションシップ」の知識が必要です。まずは、リレーションシップについて学んでいきましょう!
リレーションシップ
リレーショナルデータベースは、「複数のテーブルをお互いに関連付けて扱える」という特色があります。この関連付けを「リレーションシップ」と呼びます。
次のように「社員テーブル」と「部署テーブル」をお互いに関連付けることができます。
社員テーブルと部署テーブルがお互いに関連付けされていることで、社員テーブルの部署IDから部署の情報を取得できるようになります。
例えば、次のように山田花子さんの部署IDから「開発部」の情報を取得できます。
テーブル同士を関連付けてデータを操作できることは何となくわかったけど、そもそも次の画像のようにテーブルを分けなきゃ良いんじゃない?
RDBでは、一般にデータ同士の関連を保ったままテーブルを分けて管理するよ!そうすると、データを変更するときに最小限の修正で済むんだよ。少し正規化について学んでみようか。
正規化
データに重複や矛盾が生じないように、データ同士の関連を保ったまま表を分ける作業のことを「正規化」と呼びます。リレーショナルデータベースを利用するときには、データ間の整合性を保つために正規化を行います。
例えば「営業部」を今後増やす予定で、従来の営業部は「法人営業部」に変更するとします。次のように1つのテーブルに情報をまとめてしまうと、全ての「営業部」の箇所を「法人営業部」に修正する必要があります。
このときに1件でも修正漏れがあると、データ内容に矛盾が生じてしまいます。
しかし、1つのテーブルにまとまっていた情報を分けて、テーブル同士を関連付けることで、修正は1箇所で済みます。
これだったら、修正漏れの心配がないよね!
あとは正規化されたテーブル同士を関連付けるために「外部キー」が必要で、データの一貫性や正当性を保つためには「外部キー制約」が必要だよ。次で詳しくみてみよう!
外部キー(FOREIGN KEY)
テーブル同士の関連付けを行うために、他のテーブルの主キーを参照するカラムのことを外部キー(FK:FOREIGN KEY)と呼びます。
次のように社員テーブルの部署IDのカラムは、部署テーブルの主キーである部署IDのカラムを参照しています。この場合は社員テーブルの部署IDのカラムが「外部キー」になります。
リレーショナルデータベースにおいて、データを参照される側のテーブルは「親」に当たり、データを参照する側のテーブルは「子」に当たります。つまり、関連付けられたテーブルは親子関係が成り立っています。
次のようにデータを参照される側の部署テーブルは「親」に当たり、データを参照する側の社員テーブルは「子」に当たります。
参照される側のテーブルを「親テーブル」と呼び、参照する側のテーブルを「子テーブル」と呼びます。親子関係が成り立つテーブルのデータの一貫性や正当性を保つためには「外部キー制約」を設定する必要があります。
外部キー制約(FOREIGN KEY制約)
外部キーとして扱いたいカラムに対して、外部キー制約(FOREIGN KEY制約)を設定することで、親テーブルに存在しないデータが子テーブルに間違って登録されないように防止することができます。
次のように親である「部署テーブル」に存在しないデータを子である「社員テーブル」に登録されてしまうと、親テーブルと子テーブルの整合性が崩れてしまいます。
上記のように社員テーブルの部署IDのカラムに3
のデータを登録しても、部署テーブルには、そのデータが存在しないので参照することができません。
このような不整合の状態を防ぐために、「外部キー」として扱うカラムに対して外部キー制約を設定します。外部キー制約を設定することで、親テーブルに存在しないデータを子テーブルに登録しようとするとエラーになり、データの一貫性や正当性を保つことができます。
親が存在しないと子は存在できないってことだね!
親テーブルのデータを削除する場合は、子テーブルにはどのような影響があるでしょうか。
次のように親である部署テーブルのレコードを削除すると、子の社員テーブルのデータの参照先がなくなることになります。親テーブルと子テーブルの整合性が崩れてしまいますね。
整合性を保つために外部キー制約の設定では、2通りの対処方法があります。
親テーブルのデータを削除する際に同じキーを持つ子テーブルのデータもあわせて削除するか、そもそも親テーブルのデータを削除できないようにするかを選択することができます。
データベース管理システム(DBMS)
データベースの機能をアプリケーションから利用するには、データベース管理システム(DBMS:Database Management System)と呼ばれるソフトウェアが必要になります。
データベース管理システムとは、データベースの構築や管理を行うシステムのことです。
データベースは「整理されたデータの集まり」のことです。データベースを利用したい側の指示により、データベース管理システムがデータベースに対する操作(データの追加など)を担当します。
データベース管理システムを利用することで、データベースを効率的かつ適切に管理することができます。
リレーショナルデータベース管理システム(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)が重要な役割を果たします。これらの知識は、データベースを効率的に管理し、適切に活用するために不可欠です。
この章のまとめ
- リレーショナルデータベースは、「複数のテーブルをお互いに関連付けて扱える」という特色があるよ!
- データ同士の関連を保ったままテーブルを分けて管理することで、データを変更するときに最小限の修正で済む
この記事で学んだことをTwitterに投稿して、アウトプットしよう!
Twitterの投稿画面に遷移します