質問: ### 前提・実現したいこと ionicで、チャットアプリを作ってます。 typescript、htmlを使ってます。 データベースは、firebaseのものを使ってます。 トークルーム、トークルームリストのページを作ってます。 LINEのようなイメージです。 DB設計は以下の通りです firebaseの場合はツリー構造上になってます。 message(メッセージごとにmessageidが付与され随時ここに追加される) |-messageid -|from | |to | |text | |roomid . . | room(トークルームごとにroomidが付与され随時追加される) |-roomid-|-member-|-memberid1 | |-memberid2 | . . user |-userid-|-name | |-birthday | |-room-|-roomid1(参加しているトークルームのid) | |-roomid2 トークルームリストは、user/userid/room以下をフェッチし、 参加しているトークルームを取得して表示します。 トークルーム内では、message以下を見て、現在表示しているトークルームのroomidに紐づいたメッセージを 取得し表示します。 ### 発生している問題 roomidを新規に生成するタイミングで困ってます。 チャット機能の処理フローは以下です。 友達リストの中から、メッセージする相手を選ぶ ↓ 既にトークしている相手?既にroomidある? ↓YES ↓NO roomid取得と同時に トークルーム画面に遷移(この時点でまだroomid無) トークルーム画面に遷移 ↓ ↓ messageノード以下を監視し roomidに紐づけられた 新規メッセージ送信時にroomidを生成 メッセージがあれば DBからデータを取得し 画面表示 以下のケースで、どういった処理をしたらいいのかわかりません。 userAとuserBがいたとします。 このユーザ達のトークルームはまだありません。 userAは、友達リストの中からuserBを選択し、メッセージ画面に遷移します。 userBも、userAを選択し、メッセージ画面に遷移します。 ここで、双方が同じタイミングでメッセージを送信します。 現状だと、同じメンバーなのに、roomidが異なるトークルームが2つできてしまいます。 自分が送信したい相手とのトークルーム画面にいる際に、相手からメッセージがきた場合、どういった処理 をしたらいいのかわかりません。 もともとroomidがあるユーザ同士のトークルーム画面では、message以下のroomidに紐づいたものを監視していますので、特に問題はありません。
回答: 一番コストが低いのは、トークルームを作成する時に「トークルームを作成しますか?」とユーザに尋ねるフローを入れることです。そうすると、同一ユーザでトークルームが2つできることは問題になりません(メッセージ機能ではなくトークルームですので) 厳密に運用しないと!ということでしたら「新規メッセージ送信時にroomidを生成」する時に、「すでに同一トークルームがあれば、既存roomidを利用」「なければ新規作成」と判定を入れる形になります。