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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

348閲覧

FirebaseRealtimeDatabaseのデータ構造について

sam3457

総合スコア52

Firebase

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/03/26 09:01

編集2018/03/27 12:01

firebaseのRealtimeDatabaseとAuthを使用したSNSアプリを作っています。
画像を一枚だけ新規作成画面のimageviewにセットし、予め登録していた名前とアイコン画像と一緒にタイムラインのcollectionviewに表示させる機能を作っています。

イメージ説明
以下は送信ボタンを押した時の処理です。

swift

1 @IBAction func post(_ sender: Any) { 2 3 //セットした画像をエンコード 4 var data: Data = Data() 5 if let image = iconImageView.image { 6 data = UIImageJPEGRepresentation(image, 0.1)! as Data 7 } 8 let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String 9 10 //firebaseにpostを送る 11 let ref = Database.database().reference() 12 let uid = Auth.auth().currentUser?.uid 13 14 let post: Dictionary = ["postimage": encodedIcon] 15 ref.child("posts").child(uid!).setValue(post) 16 17 KRProgressHUD.showSuccess(withMessage: "送信しました") 18 19 //画面を閉じる 20 self.dismiss(animated: true, completion: nil) 21 }

以下がデータ構造です
イメージ説明

ご覧の様に、投稿データであるpostには投稿画像の画像データしか入れていません。

しかし、タイムラインのcollectionviewにはusername,usericon,postimageの三つを一つのセルとして表示する予定です。

この様な機能を実装する場合、postのデータ構造は投稿主の名前、アイコン、投稿画像(username,usericon,postimage)の三つのデータをまとめておくものなのでしょうか?

もしまとめるとなると、profのデータとpostのデータ内容の(usernameとusericon)が被ってしまうと思われるのですが、ここは致し方ないのでしょうか?

それとも私の現在のコードの様に別々に送り、表示するときにuidなどで投稿したユーザーのprofとpostを結びつけてタイムラインに表示するものなのでしょうか?

また、一般的にこの様なSNSアプリではこの様な構造にするのがセオリーだ。などありましたらお教えいただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

それとも私の現在のコードの様に別々に送り、表示するときにuidなどで投稿したユーザーのprofとpostを結びつけてタイムラインに表示するものなのでしょうか?

こちらのパターンが適していると思います。postの方にプロフィール情報まで埋め込んでしまうと、データの量も多くなってしまいますし、ユーザーがプロフィールを変更した場合に過去の投稿では古いユーザー名やアイコンが表示されてしまうことになります。


また、ご質問の主旨からは少しそれてしまいますが、画像ファイルを投稿に添付したい場合は以下の点からFirebase Storageの方を使われることをオススメします。

  • DB内に文字列として保存するにはデータ量が大きい

→ データの取得・保存に時間がかかる
→ DBの利用料が高額になる

  • SNSアプリでよくあるような、投稿の内容だけ先に取得して画面を早く表示し、画像ファイルをあとから取得して表示するといったことが実現できる

それと、Firebaseに関する質問は Firebase タグを付けていただいた方が回答がつきやすいかと思います。

投稿2018/03/26 12:52

編集2018/03/26 22:09
kakajika

総合スコア3131

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

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

sam3457

2018/03/27 12:09 編集

返信が遅くなって申し訳ありません。 回答ありがとうございます!いつも大変お世話になっております。 やはり別々にDBに保存しておき、表示するときに一緒に表示するものなのですね! データ容量が大きいものはStorageの方が適しているのですね。早速導入してみます! タグの件了解致しました。次回から気をつける様にします。 kakajika様のおっしゃる様なSNSアプリのセオリーの様なものに触れる機会があまりないもので、いつも非常に助かっております。 ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問