はじめに
- まず、firebaseを使うことで、uriをイメージしながら設計し直さないといけないと思った。
/users/{user_id}/profile
でデータを取り出すようなね。
- 現在トレーニング管理アプリをFlutterで作成中です。
- 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
- 種目名
- 部位
- 詳細
参考文献