質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

4788閲覧

動的な状態情報をデータベースで管理すべきか

sont

総合スコア35

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2016/04/09 03:55

###前提・実現したいこと
データベースを使う時の勘所についてアドバイスをください。
現在、チャットアプリを自作しています。
ログインしたユーザーが登録している友達ユーザーがログインしているかどうかを表示したいと思っています。
ユーザー情報はmongoDBで管理しており、ログインしているかどうかの「状態」情報も一緒にmongoDB上でユーザー情報の一つとして管理をしようと設計をしていたのですが、ふと疑問に思ったのがこういった頻繁に変動し得る「状態」もデータベースで管理するのが一般的なやり方なのでしょうか?
何となく、データベース=静的な情報を管理するもの、例えばメールアドレスやユーザー名など、というイメージがあり質問させてもらいました。

かといって、初心者のためこの「状態」情報をデータベース以外で管理するとしたら何ですればいいのかも良くわかっていないような状況です。

どなたかアドバイスをお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

と、問う前に考えてみてください。
情報の共有、保存、参照が必要なわけですが、
それらを、何時、何処で、誰が、何を、どの様にして、如何する、結果どうした、如何なって欲しい
を、箇条書きにして整理します。
その上で、
1.情報の保存、参照、共有を何れで行うか?
考慮としては、扱いやすさ、永続化の必要性、他、自身で重要度をつける
例えば、(例ですから、必ずしもこの様ではありません。)
速度面:オンメモリ>データベース>ファイル
扱い易さ:ファイル>データベース>オンメモリ
但しファイル操作では、書換と読出の衝突時の考慮条件が厳しい。
などと、書出していきます。
2.いつ行うか
場面、場合を想定したシナリオを書きます。
3.どのように使うか
場面、場合を想定したシナリオを書きます。
いきなりは、難しいので、
個別の部分毎に、必要事項を書出して、全体に矛盾が無いか検討し、、、
やら、
全体を考えて、個別事項を書出だして、、、
でも、
複雑な場面、状況は、
状態遷移図、真理値表を使って、思考の整理、ロジックの単純化を行います。
ソフトウェア設計でも、条件判断は究極では True / False になるわけですから、
真理値表の手法を使って、整理が可能です。
で、実装を考えます。

投稿2016/04/09 04:26

編集2016/04/09 04:30
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

身も蓋もない回答ですが、DBに持ってもいいですし、memcachedなんかのKVSに持たせてもいいでしょう。「状態」と考えるとDBに持たせるのはどうかなと考えられるかも知れませんが、「ログイン/ログアウトの履歴」だと考えてしまうとDBで管理すべきものだというイメージが湧いてきませんか。

更新検索にかかる負荷であるとか、データの信頼性(記録としてきちんと補完しておかなければならない、何かの都合でまっさらになってもその後のログインの状態さえわかればいい)なども判断材料になるでしょう。

投稿2016/04/10 09:00

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

状態の管理を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

投稿2016/04/09 05:37

編集2016/04/09 05:45
iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問