前回、テーブル設計を見直したことで、「利用者」と「書籍」の両テーブルに、データが繰り返し入力されるフィールドができました。
そこで今回は、正規化の復習を兼ねて、もう一度考えてみましょう。
どんなテーブルに分けて、どのようにフィールドを変更すれば、テーブルを正規化できるでしょうか。
ヒントは、テーブルにまとめる時のコツと同じで、
「繰り返し入力する可能性のあるものは、別のテーブルに分ける」
ことです。
【1】利用者テーブルでは、「性別」が繰り返し入力されています。
【2】書籍テーブルでは、「著者」と「出版社」は同じデータが入力される可能性があります。
・同じ著者が、何冊も本を書くことがある
・同じ出版社から、たくさんの本が出版される
今回はレコード数が少ないので、実際には重複していませんが、「重複する可能性」があるなら、別のテーブルにすることを検討します。
それでは実際にテーブルを正規化してみましょう。
【3】性別は別のテーブルに分け、性別CDで参照できるようにします。
【4】著者と出版社も別のテーブルに分け、それぞれ CD で参照できるようにします。
【5】貸出履歴テーブルに変更はありません。
・貸出履歴
これでテーブルの正規化が完了しました。
テーブルを正規化することで、同じデータを何度も入力する手間が省け、入力ミスも防げます。また保存時の容量も少なくて済みます。
【解説】
最終的な各テーブルの関係をまとめると、以下の図のようになります。
この図の関係がわかれば、リレーショナルデータベースを理解することができます。掴んで欲しいポイントを以下にまとめます。
(1)「貸出履歴」テーブルがメインで、他のテーブルは、データを参照するために使われています。
(2)利用者や書籍のテーブルからも、さらに他のテーブルを参照している点に注目してください。
(3)貸出履歴テーブルの利用者CDを変更するだけで、氏名や性別は、自動的に変わります。CD が変われば、参照するデータが変わるわけですから、当然ですよね。
(4)同様に、貸出履歴テーブルの書籍CDを変更すると、タイトルや著者、出版社が自動的に変わります。
(5)逆に、利用者テーブルの変更点や、書籍テーブルの変更点は、すぐにクエリに反映されます。貸出履歴テーブル側では、何も変更する必要はありません。
つまり、利用者の氏名の修正や、書籍のタイトルの修正は、一箇所だけで済むということです。