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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

NoSQL

NoSQL(not only SQL)は、リレーショナルデータベース管理システムとは異なるデータベースシステムを指す言葉です。

Q&A

解決済

2回答

3551閲覧

Firebase Realtime Databaseでのデータ構造ごとのメリット・デメリット

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

NoSQL

NoSQL(not only SQL)は、リレーショナルデータベース管理システムとは異なるデータベースシステムを指す言葉です。

0グッド

0クリップ

投稿2017/03/31 03:50

編集2017/04/04 03:29

Firebaseを使ってユーザーごとのデータを管理するアプリを作ろうとしているのですが、データ構造を下記のいずれにしようか迷っています。
公式ガイドでは案2のようにネストを浅く保つことが薦められていますが、他ユーザーのデータにアクセスすることがないようなアプリであれば案1でも特に問題がないようにも思えます。
明確にこちらがよいという理由が思い浮かばず、決めかねているのですが、それぞれを採用する場合のメリット・デメリットを教えていただけるとありがたいです。
よろしくお願いします。


2017-04-04 追記
案2のような構造にした場合、ユーザーごとのデータはユーザーしか閲覧できないように権限を設定すると、セキュリティルールの仕様上、一覧を取得できなくなるので、案2を改造しました。

######案1
ユーザーのIDがルート直下にあって、それぞれのユーザーIDの配下に各種データ構造を持たせる。

json

1{ 2 "user_id_1": { 3 "diaries": { 4 "diary1": { ... }, 5 "diary2": { ... }, 6 ... 7 }, 8 "todos": { 9 "todo1": { ... }, 10 ... 11 } 12 }, 13 "user_id_2": { 14 "diaries": { 15 "diary1": { ... }, 16 "diary2": { ... }, 17 ... 18 }, 19 "todos": { 20 "todo1": { ... }, 21 ... 22 } 23 }, 24 ... 25}

######案2
各データ構造のデータごとにユーザーのIDを持たせる。

json

1{ 2 "diaries": { 3 "diary1": { 4 "user_id": " ... ", 5 "details": " ... " 6 ... 7 }, 8 "diary2": { 9 "user_id": " ... ", 10 "details": " ... " 11 ... 12 }, 13 }, 14 "todos"; { 15 "todo1": { 16 "user_id": " ... ", 17 ... 18 }, 19 }, 20 ... 21}

**追記)**これだと各データはそのユーザーにしかアクセスできないようにルールを設定した場合、/diaries/todosでデータの一括取得ができなくなる。(Firebaseガイド:ルールはフィルターではない
なのでこうする必要がある。こうすれば/diaries/[user_id]でユーザーごとのデータ一覧が取得できる。

json

1{ 2 "diaries": { 3 "user_id_1": { 4 "diary1": { 5 "user_id": "user_id_1", 6 "details": " ... " 7 ... 8 }, 9 "diary2": { 10 "user_id": "user_id_1", 11 "details": " ... " 12 ... 13 }, 14 }, 15 "user_id_2": { ... }, 16 }, 17 "todos"; { 18 "user_id_1": { 19 "todo1": { 20 "user_id": "user_id_1", 21 ... 22 }, 23 }, 24 }, 25 ... 26}

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

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

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

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

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

guest

回答2

0

_メリットデメリット
案1コードが書きやすい 自分の日記やTodoだけ見る仕様において、アプリを実行しているユーザーの日記やTodoだけ絞って取るコードが書きやすい。拡張性が低い もし万が一今後、日記に他ユーザーが良いね出来るといった仕様が付いた際に、良いね数が多い順に並べ替える操作がしにくい。
案2拡張性が高い もし万が一今後、日記に他ユーザーが良いね出来るといった仕様が付いた際に、良いね数が多い順に並べ替える操作がし易い。(インデックスを貼るだけでいいので)設定の手間が増える アプリを実行しているユーザーの情報だけ絞るために、user_idにインデックスを貼る必要があるので、手間がかかる。(貼らないとレスポンスが遅い。)

という感じの印象なので、拡張性という点で案2のほうが良さそうな気がしますね。

もちろんこのサービスが今後そういう機能拡張を絶対しないと言い切れるのであれば、案1で問題ないと思います。

(なんとなくの気分で、表形式で書いてみました。見づらかったらスミマセン。。。)

投稿2017/03/31 06:58

kanemotos

総合スコア163

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

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

退会済みユーザー

退会済みユーザー

2017/03/31 09:21

ご回答ありがとうございます。 たしかにユーザーを横断的に操作する機能は作りにくくなりますよね。 その辺はおっしゃられているように、今後の仕様の見通しに大きく左右されるということですね。 表形式で非常に見やすいです。ありがとうございます。
guest

0

ベストアンサー

FirebaseではFan-outテクニックを推奨しており、データの取得時のパフォーマンスがよくなるようにデータの重複を適宜行うようにする方法がよいようです。こちらの内容が参考になりました。

ですので、とりあえず案1で進めていき、ユーザーを横断するような操作が必要になったときは下記のような構造を別に用意して対応しようと思います。

json

1{ 2 // 案1の通り、ユーザーIDをキーに、各ユーザーのデータを個別に丸ごと格納する 3 "user_id_1": { user_id_1のユーザーのデータ }, 4 "user_id_2": { user_id_2のユーザーのデータ }, 5 6 // [user_id]/diaries以下の内、他ユーザーにも公開する設定のもののコピーを登録する 7 "public_diaries": { 8 "diary1": { 9 "user_id": "user_id_1", 10 "public": true, 11 "star_count": 0, 12 ... 13 }, 14 "diary2": { 15 "user_id": "user_id_1", 16 "public": true, 17 "star_count": 10, 18 ... 19 }, 20 } 21}

ありがとうございました。

投稿2017/04/04 03:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問