はじめに
今回はデータベースの正規化について、前編と後編に分けてわかりやすく解説していきます。
データベースの正規化は、リレーショナルデータベースを扱う際には非常に重要となる概念です。そのため、データベースの正規化ができなければ、リレーショナルデータベースを使いこなすことは愚か、データベース自体をぶっ壊しかねない大変な事態を引き起こす可能性があるので、完璧に理解しておきたいですね。
また、「リレーショナルデータベースってのがよくわからんのよ」という方は、以下の記事をご覧になってから今回の解説を見るようにしてください。
さらに、今回はデータベースの正規化について、前編と後編に分けて解説していきます。一口に「データベースの正規化」といっても、細かく説明しようとすると膨大になりますからね。
前編である今回は、まず、データベースの正規化の目的を確認した後、データベースの正規化における重要概念である「キー」について解説していきます。
もし、「キーはもう知ってるよ!」という方は、以下の『データベースの正規化とは(後編)』からご覧ください。
データベースの正規化の目的
データベースの正規化の目的とは、
「ゴチャゴチャ一つにまとまっているデータを、データベースとして扱いやすい形に変えること」
です。
より具体的には、
「データの繰り返し・重複・矛盾を避ける」
ということです。
多くの人がデータベースの正規化でつまずいてしまう理由は、いきなり中途半端に分割されたテーブルが提示され、正規化の説明を受けるからだと思われます。
どういうことかというと、そもそも、リレーショナルデータベースの最初の形は、「一つのテーブルにすべてのデータがまとまった状態」なのです。
リレーショナルデータベースは図書館だという話をしましたが、その話で例えると、すべての本が、ジャンル分けなど全くされずにあいうえお順に並んでいる、というような状態です。
前回、リレーショナルデータベースの最強にして最大の特徴は、複数のテーブルを関連付けられることだ、という話をしました。
しかし、実はこれ、正規化の「後」の話なんですね。
つまり、正規化をした結果、連結した複数のテーブルが表れた、というだけで、本来はすべての情報が一つのテーブルにまとまっているもなのです。
それを知らずに、中途半端に正規化してある画像を見せられて「これが正規化です」と言われても、そりゃわけわからなくもなります。
ということで、まずは本来のデータベースの形から、「ゴチャゴチャ一つにまとまっているデータを、データベースとして扱いやすい形に変える」という目的に沿って、データベースの正規化の方法を説明していきます。
今回は、その中でも「キー」という概念について詳しく解説してきます。
「キー」という概念について
キーとは
まず、データベースの正規化に必要不可欠な概念であるキーについて解説します。
キーとは、任意のレコードを特定するための項目のことで、数字やアルファベットなどが使われます。恐らく、何を言ってるかわからないと思うので、図を使って説明していきましょう。
まず、以下のような生徒一覧がデータにとなっているテーブルがあるとします。
この中で「佐藤太郎君の情報が欲しい」と思った場合、みなさんだったらどうするでしょうか。
「名前から検索すればよくね?」と思ったそこのあなた、テーブルをよく見てみてください。
なんと、佐藤太郎君が二人いるではありませんか!しかも、学年などが違うことから、この二人は同姓同名の他人なようです。
しかし、コンピューターからすると、佐藤太郎君と検索した場合、名前の項目に佐藤太郎があるレコードはすべて同じという判定となります。そのため、何らかの方法で、二人の佐藤太郎は別人なのだ、ということをコンピューターにわからせてあげる必要があるのです。
では、「生徒番号」から識別してあげるとどうでしょうか。
サッカー部の佐藤太郎君を選びたければ、生徒番号「1」を指定すればよく、相撲部の佐藤太郎君を選びたければ、生徒番号「7」を指定してあげれば良いことになります。
ここで、「『サッカー部』かつ『佐藤太郎』みたいな感じで選べばよくね?」と思った方、確かにそのような選び方も可能です。
しかし、データベースはこれから先も更新され続けます。つまり、将来的に名前が佐藤太郎で、部活がサッカー部みたいな奴が表れる可能性も十分あり得るということです。そうなった場合、やはりダブりが生じてしまいますね。
一方、数字を1番から順に番号を振っていけば被ることはありませんし、しかも被らない数字は無限にあります。
このように、それぞれのレコードを識別することができるカラムのことを「キー」と呼びます。
キーの種類
キーにはその特徴や使い方によって、いくつかの種類に分けることができます。以下では、その中でも重要なものに絞って解説していきます。
主キー
主キーとは、1つのレコードに特定できるカラムのことです。「キーとは」で説明したそれぞれのレコードを識別することができるカラムのこととは、まさに主キーのことを言います。
リレーショナルデータベースには主キーが必ず必要であり、尚且つ主キーが空欄であってはいけません。また、1つのテーブルに設定できる主キーの数も1つだけです。
代替キー
代替キーとは、リレーショナルデータベースに主キーとなり得るカラムが無かった場合に、主キーの役割を担わせるためだけに作るカラムのことです。
「え、つまり代替キーは主キーのこと?」という疑問がでてきそうですが、結論から述べると、代替キーは主キーのことです。
違いとしては作られたカラムの経緯ですよね。
主キーは、元々リレーショナルデータベースにあったカラムの中で、「お、こいつ主キーにできるやん」ってなった奴のことです。
一方、代替キーは、元々リレーショナルデータベースになかったカラムで、「他のカラム使えんからお前加えるわ」と言われて作らたカラムのことです。
つまり、何の目的で作られたカラムなんですか、というので主キーか候補キーかになるんですね。
複合キー
複合キーとは、主キーになり得るカラムが無かった場合に、複数のカラムを組み合わせて主キーの役割を担わせるというものです。
例えば、以下のような生徒名簿があったとしましょう。
学年やクラスはもちろん、出席番号も必ず重複がでますので、主キーにはなり得ません。
では、学年、クラス、出席番号を繋げた場合どうなるでしょうか。例えば、田中次郎君は2年4組21番ですが、この組み合わせであれば確実に一つに絞り込むことができますね。
学年が一緒の人はもちろんいますし、クラスが一緒の人もいます。また、出席番号だけであれば、他化のクラスや学年に同じ人はいますよね。しかし、学年・クラス・出席番号という組み合わせならば、必ず一人しかいません。
このように、複数のカラムを組み合わせることで、一つの主要キーとしての役割を担わせるものを、複合キーと言います。
候補キー
主キーの条件に合致するカラムや、複数のカラムを組み合わせたものをものをいいます。
例えば、下記のテーブルでは、生徒番号が主キーとなり、学年・クラス・出席番号の複合カラムが候補キーとなります。
外部キー
外部キーとは、リレーショナルデータベースの結合を実現させるためのキーです。
例えば、以下のようなテーブル達があるとします。
この2つのテーブルを連携させるためには、生徒番号を使って紐づけてあげると、2つのテーブルが連動しますね。
例えば、生徒番号10番の生徒である柏崎星奈ちゃんの名字が「羽瀬川」に変わった場合、生徒名簿一覧の方だけ変更すれば、それに伴って他のテーブルの生徒番号10番に該当するレコードも書き換わる、という仕組みです。
また、外部キーは原則として主キーとなるカラムである必要があります。
まとめ
とうことで、データベースの正規化の前編であるキーについて解説は以上になります。
中々にボリューミーになってしまいましたが、言い換えれば、それだけ重要で尚且つ理解しづらいものであるということですね。
実際、キーをしっかりと使いこなせないとエラーが出まくってしまいますので、ここは確実に押さえて欲しいところです。
次回は、主題であるデータベースの正規化について、詳しく解説します。
正規化のところでも、キーの考え方が非常に重要な役割を果たしましたので、まだあまり理解できていないよ、という方は是非もう一度見直してから、次回に進むようにしましょう。