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

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

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

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

551閲覧

投稿に対してユーザー情報のnullを許容するFirestoreの設計

whoiwhoi

総合スコア48

Firebase

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/07/17 18:42

編集2020/07/17 23:12

前提・実現したいこと

React.jsとFirebaseを使って掲示板を作っています。
掲示板の機能は下記の通りです。

  • ユーザー登録およびログインしていなくても、掲示板に投稿できる
  • ログイン状態で投稿すると、投稿に対してユーザーの名前が添えられる
  • ユーザー情報を更新すると、投稿に添えられた名前も更新される

以上です。
現状はユーザーの名前を格納するUsersコレクション(ドキュメントのIDはuid)と、本文とuidを格納するPostsコレクションを作成しています。

上記の機能の場合におけるFirestoreの設計を教えていただきたいです。

現状のソースコード

処理の流れは下記の通りです。

  1. Postsコレクションを取得して配列に格納し、array.map()でレンダー
  2. array.map()の各オブジェクトを子コンポーネントPostに渡す
  3. Postコンポーネントで、渡されたオブジェクトから本文を表示、オブジェクトにuidがあればUsersコレクションからuidを使いデータを取得して表示

コレクションの取得は、react-firebase-hooksというライブラリを使用しています。

PostList.js

js

1import { useCollectionData } from "react-firebase-hooks/firestore"; 2 3const PostList = () => { 4 const postsArray = useCollectionData(db.collection("posts"))[0]; 5 6 const posts = postsArray.map((postObj, index) => ( 7 <Post postObj={postObj} key={index} /> 8 )); 9 10 return <div>{posts}</div>; 11};

Post.js

js

1const Post = ({ postObj }) => { 2 const [user, setUser] = useState(); 3 useEffect(() => { 4 if (!postObj.uid) return; 5 db.collection("users").doc(postObj.uid) 6 .onSnapshot(doc => setUser(doc.data())); 7 }, [postObj.uid]); 8 9 return ( 10 <> 11 <p>{postObj.text}</p> 12 {user&& <span>{userData.name}</span>} 13 </> 14 ); 15};

上記コードでの問題点

ユーザー情報が無いはずの投稿にユーザー情報が付いたり逆に付かなかったりなど、投稿とユーザー情報の紐付けに齟齬が生じます。
初回レンダー時は正常に紐付けられレンダーされますが、投稿すると上記の齟齬が生じます。
齟齬の原因は、ユーザー情報の取得を待たずして投稿がレンダーされるからかと思われます。

とはいえ現状のFirestoreの設計ではこの問題を解決する方法が考えられないため、Firestoreの設計から作り直せば問題を解決できると考え、質問した次第です。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問