Firestoreとは?
Firestoreは、NoSQLデータベースで、JOINとかできないですが、ある程度のSQLは使えます。クエリ実行時は全てインデックスが使われるので、作成されていないインデックスが必要な場合、実行できません。
Firestoreのすごいところ
- Googleのサーバ使って勝手にスケールしてくれる
- リアルタイムにデータ取得できる
- オフラインでもうまいことデータを扱える
- トランザクション機能もある
- ある程度の規模になっても安い(ことが多い)
- クライアントから直接アクセスできる(セキュリティも細かく設定できる)
- Algoliaとか使えば、複雑な検索もできる
- サーバ側の処理が必要ならCloud Functions使えばいい
NoSQLのメリデメ
NoSQLは、非正規化、集計、application side joinが基本テクニックだそうです。
正規化しないというのは、usersとshopsがあるときに、userはshopに紐づくわけですが、users.shop_idとせずに、users.shop = {name: 'お店', address: 'Tokyo'}みたいにやることになります。これは確かにJOINいらずで、JOINするよりも読み込みは速いはずですが、当然ながら、書き込みの際がすごい大変で、バグだらけになる怖さが、MySQLばっかりやってる人間からすればあると思います。でもJOINできないことに悲観的になると、NoSQL使えませんのでとりあえず楽観的になります。
集計というのは、集めるってことで、非正規化と同じようなものですが、何しろ、基本的に、正規化してテーブルを細かく分けることを正義とするのではなく、むしろ正規化しないでデータをあらゆるところに重複してもち、まとめられるテーブルは全部まとめるという考え方を、正義といわないまでも、なしじゃないんだよ、正しい行いなんだよということだそうです。
appplications side joinというのも、JOINできないんで当たり前なんですが、JOINをしなくていいように頑張りつつ、どうしてもJOINしたいときは、クライアントサイドでJOINすることになるね的なことらしいです。まあクライアントサイドでJOINといってもMySQLみたいなJOINではなく、必要なデータを都度NoSQLに問い合わせて取得しようねということっぽいです。
要するに正規化は強力ですが、正規化を徹底するが故に、スケールさせることが大変というのがあるらしいです。最近データ量も多いし、データの種類もバラバラだし、にもかかわらず速くしろ速くしろいうし、ふざけんなよということです。よって、正規化をやめて、スケールしやすくて、ばらばらでもよくて、超速いというのを作りました。書き込むとき大変というけど、頑張ればいいじゃんということです。書き込みより読み込み量のが圧倒的に多いんだよということです。
ですので、頑張れといわれてもさすがにそれはないでしょうというくらいに大変な書き込みを圧倒的頻度で実行しなくてはいけないようなサービスを作る場合さすがにNoSQLが向いていない可能性はあるのかなあと思いました。