uwu

プログラミングの備忘録を書いています。誰かの為になれば幸いです

FirestoreのDB設計を考えてみる

FirestoreのDB設計の仕方、セキュリティルールなどを学習したので
実際に作りたいアプリのDB設計を考えていきます!


作りたいサイト


英語圏の人に向けて、日本語の俗語、
特にサブカルチャーから作られた俗語に焦点を当てた
辞書サイトを作りたいです。


サブカルチャーとは、マンガやアニメのことです。


日本語の俗語が見れるサイトは存在するのですが
サブカルチャーに焦点をあてたものはありませんでした。

作ろうと思った背景


WoWというMMORPGゲームをプレイしていて、
たまたまゲーム内でぶらついてた時に招待された
トルコ系オーストラリア人達のギルドに所属しているのですが
何故か日本のサブカルチャー好きな人が多く
よく「草ってどういう意味?」とか聞かれるので🤣
彼らの助けになればいいなと思い作成することを決めました。


それと、サイトを作成するために調査を行っていたところ、
とある調査では半数以上の日本語学習者が日本語を学習しようと思ったきっかけは
サブカルチャーへの興味」と答えた、ということを知り、
そういう方の為にもなればなーと思っています。

フェーズ


最初はとりあえず検索フォームから単語を探せたり、
カテゴリー別に単語をAtoZで表示するといったシンプルな機能をつけたいです。


単語が増えてきたら、管理画面を作り、
そこからCRUD操作を行ったり、管理者を増やしたりなどの機能を増やすことも考えています。


サイトを表示するのに必要な情報の洗い出し


・単語名(日本語)
・単語のふりがな
・単語の読み方(ローマ字)
 →AtoZの並び替えはこの読み方を参照するのがよさそう?
・単語の意味(英語)
・単語を説明するのに必要であれば画像(1枚)
・単語を使った例文
・例文の読み方(ローマ字)
・カテゴリー


現状必要な情報といえばこれくらいです。



今のところ画像はFirestorageに保存して
パスをFirestoreに保存して参照する方法で考えています。
AWSのS3の方が慣れてますが折角なのでFirestorage使いたいと思います🙂



今後の拡張を考えて



・単語を登録した日
 →新着順に並べたくなった時に必要
・単語を登録した人のID


管理者画面を作った時のために事前にユーザー情報もいれたいです。


ユーザー情報としては、
・名前
・email
・パスワード
・役職


あたりが必要な情報かなと思います。

必要な情報を元にDB構造を考える

単語の前方一致検索を導入したいと考えているのでそれも念頭に置いておかねばなりません。



単語コレクションとユーザーコレクションを作る



こんな感じです。


words(トップレベルコレクション): {
  wordドキュメント 1: {  
    name: "草",
    kana: "くさ",
    nameInEng: "kusa",
    meaning: "Something funny. You can use it just like lol",
    imgPath: "/images/kusa.jpg",
    Example: "マジで草",
    ExampleInEng: ”maji de kusa”,
 category: ["General"],
    authorRef: /user/user1,
    createdTime: 2022-08-27~,
  },
  wordドキュメント 2: {
   name: "推し",
   kana: "おし",
   nameInEng: "oshi",
   meaning: "Someone you love. Usually used for anime characters, Vtubers, and idols",
   imgPath: "/images/oshi.jpg",
   Example: "これが私の推しです",
   ExampleInEng: "kore ga watashi no oshi desu",
   category: ["Anime", "Vtuber", "Idle"],
   authorRef: /user/user/1,
   createdTime: 2022-08-27~,
  },
  ...
}

users(トップレベルコレクション): {
  userドキュメント 1: {  
    name: "bluh bluh",
    email: "bluhbluh@bluhbluh.com",
    password: "***********",
    role: "Owner",
  },
  ...
}


考えられるメリット:
・サイトの表示に必要なデータは全てwordsコレクションに入っているのでread/writeが簡単
・読み取り回数が少ないので、もし利用者が増えて無料枠を出た時も安心。



考えられるデメリット:
・カテゴリー別に単語をatoz、リスト形式で表示する画面で
「単語名、単語のふりがな、単語の読み方」のみが必要なところを
不要な「単語の意味や例文、画像パス」などの情報も読み込んでしまう


正直、小規模なサイトですし、単語の数が数万にも及ぶなんてことも
考えられないのでそこまでのデメリットではないかなーと思います。


もしこの単語の情報をサブコレクションに保存するとなると、
不要な情報を読み取らなくて済む分、読み取り回数が増えるというデメリットが発生します。


カテゴリーコレクションを作ることも考えたのですが、
管理者画面から単語を登録できるようにしたときのための
選択フォームに表示する用くらいしか用途が思いつかないのでこちらは後から作っても問題なさそうです。



とりあえずはこれで作っていってみようと思います!🙂