質問: ["postimage": encodedIcon] ref.child("posts").child(uid!).setValue(post) KRProgressHUD.showSuccess(withMessage: "送信しました") //画面を閉じる self.dismiss(animated: true, completion: nil) } ``` 以下がデータ構造です ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/99d402e1b69cdcc11548a4f4a776ad23.png) ご覧の様に、投稿データであるpostには投稿画像の画像データしか入れていません。 しかし、タイムラインのcollectionviewにはusername,usericon,postimageの三つを一つのセルとして表示する予定です。 この様な機能を実装する場合、postのデータ構造は投稿主の名前、アイコン、投稿画像(username,usericon,postimage)の三つのデータをまとめておくものなのでしょうか? もしまとめるとなると、profのデータとpostのデータ内容の(usernameとusericon)が被ってしまうと思われるのですが、ここは致し方ないのでしょうか? それとも私の現在のコードの様に別々に送り、表示するときにuidなどで投稿したユーザーのprofとpostを結びつけてタイムラインに表示するものなのでしょうか? また、一般的にこの様なSNSアプリではこの様な構造にするのがセオリーだ。などありましたらお教えいただけると幸いです。
回答: > > それとも私の現在のコードの様に別々に送り、表示するときにuidなどで投稿したユーザーのprofとpostを結びつけてタイムラインに表示するものなのでしょうか? > > > こちらのパターンが適していると思います。postの方にプロフィール情報まで埋め込んでしまうと、データの量も多くなってしまいますし、ユーザーがプロフィールを変更した場合に過去の投稿では古いユーザー名やアイコンが表示されてしまうことになります。 また、ご質問の主旨からは少しそれてしまいますが、画像ファイルを投稿に添付したい場合は以下の点からFirebase Storageの方を使われることをオススメします。 * DB内に文字列として保存するにはデータ量が大きい → データの取得・保存に時間がかかる → DBの利用料が高額になる * SNSアプリでよくあるような、投稿の内容だけ先に取得して画面を早く表示し、画像ファイルをあとから取得して表示するといったことが実現できる それと、Firebaseに関する質問は `Firebase` タグを付けていただいた方が回答がつきやすいかと思います。