NoSQLでは、あなたのアプリがそれを使いたい方法でデータをモデリングする必要があります。あなたは、ユーザーがその一部である会話のリストが必要な場合、あなたは、データベースにそのリストを維持する必要がありますので。これにより
/conversationMessages
$conversationId
$messageId
text: "Hello world"
sender: "uid of sender"
name: "name of sender"
/userConversations
$uid
$conversationId1: true
$conversationId2: true
あなたは簡単に各ユーザーがその一部である会話のリストを調べることができますそれらのいずれかのメッセージをロードします。おそらく、また、各会話のためのメタデータの別のリストを維持したいと思う:
/conversationMetadata
$conversationId
lastUpdated: timestamp (set with ServerValue.TIMESTAMP)
title: "name of our chat room"
あなたが彼らの会話IDをロードし、各会話のメタデータをロードすることによって、ユーザーのための会話のリストを表示することができますこの方法:
var ref = database.ref().child("userConversations").child(auth.uid);
ref.on('child_added', function(conversationKey) {
var conversationRef = database.ref().child("conversationMetadata").child(conversationKey.key);
conversationRef.once('value', function(metadataSnapshot) {
console.log(metadataSnapshot.val());
});
});
SQL知識をNoSQLデータベースにマップしようとすると、学習が困難になります。 relevant section of the Firebase documentationとこのarticle about NoSQL data modelingを読むことを強くお勧めします。
ありがとうございました。もう1つの質問:Firebaseで参照を作成するサポートはありますか?たとえば、ユーザーのオブジェクトを会話に保存して、会話リスト画面にユーザーの名前と写真を表示できるようにします。 – iMemon
管理された外部キー参照はありません。しかし、(管理されていない)参照を持つことは非常に一般的です。 [データをスケールする](https://firebase.google.com/docs/database/android/structure-data#fanout)のドキュメントのセクションを参照してください。 –
私のセネリオではグループ/ユーザチャットがあり、チャット名と画像はそのグループ/ユーザからフェッチされます。ユーザーはいつでも変更するオプションがあるので、それをデノーマライズすることはできません。だからあなたの言及したアプローチから、私はテーブル/ conversationMetadata私はユーザー/グループの参照をすることができます。問題は、上記のコードで説明したように、会話リストを取得することです。まず、userConversationsを取得してから会話ごとにconversationMetadataを取得してから、userDataまたはgroupData(名前/画像を取得する)を取得する必要があります。それは遅すぎると思いませんか?助けてください。 – iMemon