35日目 データベースのテーブル同士の関連付け対応①(クラス図書き直し&ER図作成)

おはようございます。昨日の記事の続きです。

昨日までで、以下のクラス図を基に、「Room」、「User」、「Comment」という3つの抽象的なモデルから、JRuby on Rails(以下、Railsと略します)を用いてそれぞれデータベース上のテーブル・カラムの定義へと具体化していき、その定義した内容をデータベースへと反映しました。(クラス≒モデル≒テーブル)

クラス図(Ver. 0.0.1)

反映が終わったので、そろそろ「View(見た目)」とか「Controller(操作)」のプログラミングに手を付けようと思っていたら、クラス図を作る時にあることを忘れていたことに気づきました…。

その忘れていたあることとは、モデル(≒テーブル)同士の関連付けが行えるように外部キーを付けることです。外部キーについては次の図を見てください。

データベースのテーブルにおいて、まず、主キーというテーブルの中で他のレコードと一意に区別できる列(カラム)があるのですが、外部キーとは、テーブルの中で他のテーブルの主キーを設定できる列(カラム)のことです。この外部キーを設定することによって、他のテーブルとの関連付けを行なうことができます。

例えば、チャットアプリを例にして、何人かの「ユーザー(User)」が、何らかの「コメント(Comment)」を発していくというような状況を考えてみます。「ユーザー」と「コメント」をそれぞれモデル(≒テーブル)とすると、「ユーザー」が一人いれば、その「ユーザー」から複数の「コメント」を発するかと思います。(まったくしゃべらないこともあります。)

その場合、何人かの「ユーザー」がそれぞれ「コメント」を沢山発していたとしても、以下のように主キーと外部キーを設定しておくことによって、それらの「コメント」が誰のものか区別することができるようになります。
・「ユーザー」は「ID」という列(主キー)で区別しておく。
・「コメント」を付けるとき、それぞれの「コメント」には誰のものかわかるように、「ユーザー」の「ID」を付けることができる列(外部キー)を追加しておく。

今回、データベースへの設定を行なうときに、その外部キーを含めることを失念しておりました…。このままだと、データベースのテーブル同士で関連付けることができず、Railsからデータベースを扱うことが難しくなります。

また、データベースのテーブル同士で関連付ける際、さきほどのクラス図(Ver. 0.0.1)を見てみると、

①「Room」と「User」は1対1以上の関係(リレーション)
②「User」と「Comment」の1対0以上の関係
③「Room」と「Comment」の1対0以上の関係

となっていて、「Comment」は②と③の通り、「User」からも「Room」からも、どちらも1対0以上の関係性があることになっています。

ですが、そもそも「Comment」は「User」から発せられるもので、「User」がいないとできないものであり、「Room」と「Comment」に直接関係がなかったとしても問題はないことに気づきました。(間接的に関係があることはあるのでしょうが)

ですので、もっとシンプルに考えるために、上の③の関係は削除して、①と②の関係のみ考え直すことにします。

ということで、クラス図の書き直しを行ないました。変更したのは以下の3点で、最初のVer.0.0.1から変更したということで、Ver.0.0.2とします。
(a)「User」モデルに「Room」から「User」を参照できる部屋IDを追加
(b)「Comment」モデルに「User」から「Comment」を参照できるユーザーIDを追加
(c)「Room」と「Comment」の関係を削除

クラス図(Ver. 0.0.2)

また、クラス図だけでなく、ER図も書いてみました。ER図とは、データベースの設計を行なうときに使用する設計図であり、以下の3つを表現することができます。
・データベースのテーブル構造
・テーブルの「主キー」と「外部キー」
・データベースのテーブル同士の関係性

詳しい書き方はこちらの記事が参考になると思います。

(最初からER図を書いた方が手間が省けたと思いますが、気を取り直して)作成したER図はこちらであり、データベースのテーブル構造のみならず、「主キー」と「外部キー」、テーブル同士の関係性がしっかり表現できているかと思います。(なお、ER図はVer.0.0.2としており、クラス図でも表現しているデータベースのテーブル構造と合うように、バージョンを合わせています。)

ER図(Ver. 0.0.2)

おわりに

ここまで読んでくださってありがとうございました。
次回は修正内容(外部キーを含めること)を実際にデータベースに反映するところまでやっていこうかと思います。
次回もよろしくお願いいたします。

この記事が気に入ったらサポートをしてみませんか?