LoginSignup
0
0

More than 1 year has passed since last update.

Firebaseなら、RDB思考をやめよう

Last updated at Posted at 2023-02-27

はじめに

  • まず、firebaseを使うことで、uriをイメージしながら設計し直さないといけないと思った。

/users/{user_id}/profile

でデータを取り出すようなね。

  • 現在トレーニング管理アプリをFlutterで作成中です。

fitness_hack.png

  • menuとpartなどのテーブルをfirebaseでいうcollection。当初、別のテーブル(コレクション)でも、外部キーであるmenu_idから引っ張ってくればいいと思っていた。が、なんともコードがごちゃごちゃ。出来ないことはないと思うが、コードを見てみると、破綻しているよう思うのだ。そう、完全に別々に取得しているのである。
// Firestoreのインスタンスを取得する
final db = FirebaseFirestore.instance;

// menuコレクションとpartコレクションを外部キーのmenu_id=1で取得する関数
Future<Map<String, dynamic>> getMenuAndPartDocumentsByMenuId(int menuId) async {
  // menuコレクションのクエリを作成する
  QuerySnapshot menuQuerySnapshot =
      await firestore.collection('menu').where('menu_id', isEqualTo: menuId).get();
  // partコレクションのクエリを作成する
  QuerySnapshot partQuerySnapshot =
      await firestore.collection('part').where('menu_id', isEqualTo: menuId).get();
  // 取得したドキュメントをMapにまとめて返す
  return {'menu': menuQuerySnapshot.docs, 'part': partQuerySnapshot.docs};
}

なので、設計をやり直す必要が出てきた。
以下のように変えました。

  • ユーザ
    ユーザーごとの情報を管理するためのCollection
    Firebase Authenticationを使用してユーザーを認証する場合、passwordをCloud FirestoreのusersCollectionに保存しなくてよいので、passwordのドキュメントは持たなくて良い
/users/{user_id}/workouts
       - user_name
       - email
       - created_at
       - updated_at
  • トレーニング実施のlog
    トレーニングごとの情報を管理するためのCollection
    トレーニングごとにSubcollectionとしてsetsがあり、セットごとの情報を持つドキュメントが作られます
workouts/{workout_id}/sets/{set_id}
		 - workout_name: 
		 - 実施日時
		 - user_id
                            - weight
                            - reps
                            - time: s
                            - wait: s
                            - 実施日時
  • 種目
    種目ごとの情報を管理するためのCollection
exercises
  - 種目ID
  - 種目名
  - 部位
  - 詳細

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0