こんにちは。
当ページにアクセスしてくださり、ありがとうございます。
この記事は、データベースのテーブル設計についての記事になります。
【目次】
問題
1つの記事に複数の画像を投稿できるアプリをつくるとします。
その時のテーブル設計として、articlesテーブルに、picture1, picture2, picture3というカラムを作成することはしません。
その理由と、どう設計すべきか説明してください。
模範回答
(理由)
・4枚以上の画像を保存するよう仕様が変わった場合、カラムを追加しなくてはいけないなど柔軟性にかけるため。
・1枚しか画像を保存しないレコードの場合、データベースに無駄が生じてしまうため。
(正しい設計)
・picturesテーブルを作成し、画像はそこに保存する。
・articlesテーブルとのアソシエーションを設定し、記事と画像を関連づける。
解説
articleテーブル(article=記事)という、記事を保存するテーブル作成方法についてです。
例えば、みなさんがTwitterのようなアプリを作るとします。(というのも、Twitterがイメージしやすいからです。)
TwitterやFacebookですと、例えば、みなさんが記事を投稿する時、
❗️文章を書く
上記は必ず行います。ですが、
❓画像の投稿
こちらはおそらく任意ではないでしょうか?
ここがミソです。
文章を書く事は必須ですが、画像の投稿はそうはいきませんよね?
どうしてだか分かりますか?
次のようなケースが考えられます。
・画像は投稿せず、文章のみを投稿
・1枚だけ投稿
・2枚だけ投稿
・それ以上を投稿・・・
上記のようにいろんな「枚数」で投稿されるケースがあり得るからです。
では、問題文のようにarticleテーブルにpicture1, picture2, picture3というカラムを用意したとします。
そうなるとarticleテーブルは、次のカラムで構成されます。
id | content | picture1 | picture2 | picture3 |
このテーブルで、投稿内容が登録されていったとします。
id | content | picture1 | picture2 | picture3 |
1 | テストです(画像なし) | |||
2 | テストです(画像1枚) | image1 | ||
3 | テスト(画像2枚) | image1 | image2 | |
4 | テスト(画像3枚) | image1 | image2 | image3 |
idが4のデータはカラム通り3枚まで入っているので問題はありませんが、それ未満の画像投稿ツイートの場合は、pictureカラムが「空」になってしまいます。
これだと何だか空白の部分が無駄に感じませんか?
またこのテーブルの構成だと、画像が3枚までしか投稿できません。
ユーザーの中には「もっと画像をあげたかったのに・・・」という残念に思うユーザーがいるかもしれません。
せっかく使って頂いているのに、このように思われるのは非常に残念ですよね??
では、どうすれば良いでしょうか?
次の通りです。
✅picturesテーブルを作成し、画像はそこに保存する。
✅articlesテーブルとのアソシエーションを設定し、記事と画像を関連づける。
picturesテーブルを作成しましょう。
尚、picturesテーブルのカラムは次の通りです。
id | article_id | image |
これで、picturesテーブルのカラム「article_id」が、articlesテーブルのカラム「id」に紐づきます。
これによって、
id | article_id | image |
1 | 1 | イメージ1 |
「articles」テーブルのidが「1」の記事に「イメージ1」という画像が投稿された、という事が分かります。
また、picture1, picture2, picture3というカラムを使わずに、今回は「image」と「article_id」を使うことによって、
画像投稿数に制限なく、保存できます。
id | article_id | image |
1 | 1 | イメージ1 |
2 | 1 | イメージ2 |
3 | 1 | イメージ3 |
4 | 1 | イメージ4 |
5 | 2 | イメージ5 |
6 | 2 | イメージ6 |
上記から、何枚も画像を投稿できることがお分かり頂けたかと思います。
また、アソシエーションについては、次の記事が参考になるかと思います。
【関連記事】
以上によって、ユーザも好きなだけ画像を投稿できるようになります。
これもユーザーを配慮した設計の一部なので、大事ですね。
まとめ
データベースは、システム開発の基礎中の基礎です。
データベースを制すれば、システム開発も制します!
↑僕がツイッターでフォローさせて頂いている、25年以上システム開発関連に勤めていらっしゃる方が上記のようにおっしゃっていたので、間違いないです。
つまり、これが出来るようになると、システムの開発がもっと楽しくなります!!
がんばってください!!
以上となります、参考になれば幸いです。
最後まで読んでいただき、ありがとうございました。