質問: ### 前提・実現したいこと データベースを使う時の勘所についてアドバイスをください。 現在、チャットアプリを自作しています。 ログインしたユーザーが登録している友達ユーザーがログインしているかどうかを表示したいと思っています。 ユーザー情報はmongoDBで管理しており、ログインしているかどうかの「状態」情報も一緒にmongoDB上でユーザー情報の一つとして管理をしようと設計をしていたのですが、ふと疑問に思ったのがこういった頻繁に変動し得る「状態」もデータベースで管理するのが一般的なやり方なのでしょうか? 何となく、データベース=静的な情報を管理するもの、例えばメールアドレスやユーザー名など、というイメージがあり質問させてもらいました。 かといって、初心者のためこの「状態」情報をデータベース以外で管理するとしたら何ですればいいのかも良くわかっていないような状況です。 どなたかアドバイスをお願いいたします。
回答: 状態の管理をDBですべきかは、システムの特性によると思います。 しかし、他のユーザーのログイン状態を管理すべきかどうかについて考えると、あまりおすすめできません。 ログイン状態は各ユーザー毎に保持していますよね。例えば、AとBが友達だとして、両方ともログインしていたとします。AもBも自分がログインしていることをUserテーブルのLoginに保持しているとします。Aは、自信の友達をFriendテーブルのFriendUserIDから、検索し結果をFrienndテーブルのFriendLoginに保持しているとします。 Userテーブル UserID Login Friendテーブル UserID FriendID FriendLogin すると、BのLoginはTrue(ログイン中)で、AのFriendテーブルのBのFriendLoginもTrue(ログイン中)となります。同じ情報が書き込まれているので、無駄があります。また、Bがログオフした際には、UserテーブルのLoginだけでなく、FriendテーブルのFriendIDでB検索をして、すべてのFriendLoginを更新する必要があります。 それよりも、必要な時に毎回、友達ユーザーのログイン状態を確認したほうが間違いがなくて良いと思います。 レスポンス的に必要な時は例外的に状態を保持することが有りますが、データベースにはACID特性という考え方があり、これを壊す様な設計は避けるべきです。興味があれば調べてみてください。 momgoDBでしたね。失礼しました。 テーブル構造は的にはFriendテーブルの定義は不要ですが、ユーザー毎に複数のFriendを持つイメージになりますが、基本的な主張は変わりません。 User * UserID * Login * Friend - FriendID - FriendLogin