💡

DB設計時は保存するデータの責務を分ける

に公開

Firestoreでのデータベース設計:ユーザーデータと単語帳データの責務分離について

今日は Firebase Firestore を使ったデータベース設計について学んだ内容をまとめます。特に、ユーザーデータと単語帳データの責務をどのように分けるべきかという点が重要でした。

前提:単語帳データとユーザーデータの構造

Firestore では、以下のような構造でデータを管理しています。

  • users/{userId}
    • words/{wordId}(サブコレクション)
      • ここに学習進捗(例:正解数、最終学習日時など)を保持している

words サブコレクションは、あくまでユーザー固有の学習データを管理する場所として利用しています。

検討した内容:wordslang フィールドを追加するか?

今回、「単語がどの言語のものか」を示す lang フィールドを
users/{userId}/words/{wordId} に追加すべきかどうかを議論しました。

結論としては、追加しないことにしました。

lang を追加しない理由

lang はユーザー固有の学習進捗ではなく、単語帳データ側に属する情報であるためです。

  • 学習進捗はユーザー固有のデータ
  • 単語の言語情報(lang)は単語帳そのものの属性

この2つは責務が異なります。
同じ場所に混在させると、データ構造の一貫性が崩れます。

一般的なデータベース設計との関連

今回の判断は、

  • 責務分離(Separation of responsibility)
  • 正規化の考え方

に基づいた、一般的で妥当なデータベース設計です。

データは「本来属するべき場所」に配置することで、データ構造がシンプルになり、将来的な拡張やメンテナンスも容易になります。

まとめ

  • users/{userId}/words はユーザー固有の学習データを管理する場所
  • lang は単語帳側の属性であり、ユーザーデータに含めない
  • この判断は一般的なデータベース設計の考え方に沿っている

Discussion