0
0

【DB設計】DM機能実装のためのDB設計で大苦戦した初心者の話

Last updated at Posted at 2023-12-06

要約

現在作成しているアプリで実装予定の機能の一つに、DM機能があります。

しかしそのための論理設計(DB設計)の過程で、なぜエンティティとしてメッセージルームが必要なのか、理解するのに時間がかかりました。

結論として、自分は手書きでテーブルとレコードを作成し、どんなエンティティが必要かイメージすることで解決できました。

本記事はこんな人におすすめ

  • DB設計でエンティティの抽出に苦戦している方
  • DB設計における初心者の躓きポイントを知りたい方

なお、用語やそもそもの理解に誤りがあるかもしれませんが、どうか生暖かい目で見守っていただけますと幸いです。

問題

  • DM機能のために必要なテーブルが分からない
  • usersテーブルとmessagesテーブルの他にmessage_roomsテーブルも必要だと言われたが、なぜ必要だか理解できない
  • よっておそらく、DB設計の体系的知識がない

アプローチ

まずDM機能に必要なテーブルは何か、LaravelDB.comを使って考えてみました。

ER図

DM要素には「usersテーブル」と「messagesテーブル」が必要で、そんで中間テーブル「user_messages」を用意して…

という思考だったと思います。

しかし今見てみると、そもそも「多対多」のリレーションがないのに、なぜか中間テーブルを用意しています。

この時点で有識者にフィードバックを求めた所、

『この設計だとメッセージをユーザーが送信することはできますが、誰が受信するかが分からない設計になっています』

とヒントを頂きました。

しかしそこから手が進まなかったので、一度基本的な部分を勉強することにしました。

教訓①
「理解することをサボらない」

少しの遠回り

そこで『達人に学ぶDB設計徹底指南書』を読み、インプットとアウトプットを行うことで解決を図ります。

その結果、なんとなく『「論理設計」の中のエンティティの抽出がうまくいっていないのではないか?』と、勘所を見つけて解決することができました。

少し時間はかかりましたが、結果としてDB設計の全体像を少し掴めた気がします。

解決への道

再度エンティティの抽出からやり直した結果、今のままだとuserとmessageが割り当てられる場所がないことに気づきました。

そこで、新たに「message_rooms」テーブルを設置。

そしてユーザーとメッセージルームの「多対多」のリレーションを仲立ちする中間テーブル「message_room_user」も必要でした。

最終的な完成図は以下の通りです。

ER図

解決に至っては、以下のように手書きでテーブル内のレコードを書き、イメージしてみるという手法も有効でした。

IMG_4333.jpg
(冗談抜きで汚くてすみません・・・)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0