💡
DB設計時は保存するデータの責務を分ける
Firestoreでのデータベース設計:ユーザーデータと単語帳データの責務分離について
今日は Firebase Firestore を使ったデータベース設計について学んだ内容をまとめます。特に、ユーザーデータと単語帳データの責務をどのように分けるべきかという点が重要でした。
前提:単語帳データとユーザーデータの構造
Firestore では、以下のような構造でデータを管理しています。
-
users/{userId}-
words/{wordId}(サブコレクション)- ここに学習進捗(例:正解数、最終学習日時など)を保持している
-
words サブコレクションは、あくまでユーザー固有の学習データを管理する場所として利用しています。
検討した内容:words に lang フィールドを追加するか?
今回、「単語がどの言語のものか」を示す lang フィールドを
users/{userId}/words/{wordId} に追加すべきかどうかを議論しました。
結論としては、追加しないことにしました。
lang を追加しない理由
lang はユーザー固有の学習進捗ではなく、単語帳データ側に属する情報であるためです。
- 学習進捗はユーザー固有のデータ
- 単語の言語情報(lang)は単語帳そのものの属性
この2つは責務が異なります。
同じ場所に混在させると、データ構造の一貫性が崩れます。
一般的なデータベース設計との関連
今回の判断は、
- 責務分離(Separation of responsibility)
- 正規化の考え方
に基づいた、一般的で妥当なデータベース設計です。
データは「本来属するべき場所」に配置することで、データ構造がシンプルになり、将来的な拡張やメンテナンスも容易になります。
まとめ
-
users/{userId}/wordsはユーザー固有の学習データを管理する場所 -
langは単語帳側の属性であり、ユーザーデータに含めない - この判断は一般的なデータベース設計の考え方に沿っている
Discussion