見出し画像

チャット機能のデータベース構築方法

「ノーコードでどこまでできるのか」という議論がありますが
これらの多くはデータベース設計によって解決できると考えています。

今回はチャット機能のデータベース設計を考えます。
BubbleやAdaloはもちろん、Glideでも実装できるはずです。

本来リレーションが1:1、1:多、多:多と、どの関係であるかも考慮しますが、一旦は省略します。関係性だけ把握できればと思います。
また、データベース設計に正解はありませんし、ツールによって設計が変わります。あくまで一例として参考にしてください。


完成イメージ

Adaloのチャットテンプレートです。
「あぽと」と「Adalo芸人」の部屋を作成し、個別チャットが実装されています。


DB構造(簡易版)

まず、基本となる構造を図示します。
二人用のチャット部屋を作成し、メッセージを送り合います。
イメージはLINEです。

画像1

Users:ユーザー情報
Conversations:チャット部屋
Messages:メッセージ本文

ユーザーがチャット部屋を作成すると、Conversationテーブルにレコードが生成されます。
この時、チャット部屋のメンバーを、Usersテーブルと結びつけて記録します。

次にメッセージを送ると、Messageテーブルにレコードが生成されます。
この時、送信者をUsersテーブル、チャット部屋をConversationテーブルと結び付けて記録します。

こうすることで、LINEのようなチャット画面を作ることができます。
チャット一覧表示
・チャット部屋と自分(Current User)が結びついている
メッセージ一覧表示
・現在開いているチャット部屋とメッセージが結びついている
自分のメッセージは右側、相手のは左側に表示
・右寄せと左寄せの吹き出しを2つ用意
・メッセージ送信者が自分(Current User)なら右側、そうでないなら左側


DB構造(Adaloテンプレート)

Adaloテンプレートをほぼ完全に図解すると、こうなります。

画像2

ReadStatus:既読情報

チャット画面表示時および、メッセージ送信時にReadStatusテーブルにレコードが生成されます。
ユーザーにはどちらもCurrent Userが入ります。

ここまで作ると、更にこのような機能が追加できます。
未読表示
・ReadStatus作成日時が、Conversation最終送信日時よりも後
・ReadStatusのユーザーが自分自身
・上記2条件を満たさないReadStatusが0個なら未読。
部屋の管理者のコマンドを追加
・作成者がCurrent Userなら部屋名変更、削除などができる

未読表示が少しややこしいですね。
もし相手がメッセージを送ると、最終送信日時が更新されます。
すると1つ目の条件を満たすReadStatusが無くなるので未読になります。
その後チャット画面を表示すると、自分の名前でReadStatusを作成します。
すると両条件を満たすReadStatusが作成され、個数が1となるので未読表示が消えます。

もしYes-No設定があれば、これを使って切り替えると簡単になりそうですね。

簡易的でよければ、最新のメッセージを取得し、送信者が自分でなければ未読表示、という方法も可能ですね。
未読というより、未返信ですが。

ここはいろんな表現方法があるし、場合によって使い分けたいですね。


AdaloテンプレートはDB学習にオススメ

DB設計の学習は、マネをしながら数をこなすのが近道である、という話を以前にしました。

マネをする対象として、ノーコードツールのテンプレートはとても良い教材になります。

特にAdaloのテンプレートは勉強教材として最適だと思います。
テンプレートのデータ構成をマネながら理解していくと、ノーコードで色んなアプリが作れることに気づくはずです。


追記:bubbleテンプレートの場合

Adaloテンプレートを解説しましたが、bubbleの場合も同じくテンプレートから学ぶことができます。

例えば、この無料のチャットテンプレート。
https://bubble.io/template/pro-messaging-1553963324044x290031175583137800

WorkFlowまでは作り込まれていませんが、実際にDBを見るとAdaloテンプレートの構成とほぼ一致しています。
Listの仕様がbubble特有ですが、考え方はAdaloと似ています。

基本の設計さえ分かれば、他ツールでも応用できますね。


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