MongoDB使うの疲れちゃったよ

疲れちゃったよ

Nodejsでプログラムを書いている僕は、DBといえばPostgresqlを使っています。
でも、ガチガチのRDBより、NoSQLでざっくりDBの構築をしたくなって、しばらくMongoDB使っていました。

MongoDBとNodejsの相性は、バッチリだと思います。何しろJSONで入れて、JSONでだせるんですから。何も考えずにオブジェクトを保存してくれて、検索もできて、なんて素敵なんだろう。

でも、気づいちゃったんです。トランザクション(Ver4.0からはありますけど)もなく、Joinもできず、フリーでそれなりに使えるClientソフトもないんです。

いやわかっていましたけど。わかってたんです。
トランザクションも自前で組みましたし、Joinがなくてもmongooseのpopulateを使えば、それっぽいこともできますし、ClientはRoboMongoを使えば最低限はできます。うん。大丈夫。MongoDB使えるよ!!。そう思って2年ほど使っていましたが、とうとう疲れてしまいました。

MongoDBから離れようと思ったのと、代わりに使うものを連々と書いていこうともいます。

代替先

Firebase Firestore

MongoDBは、JSONで書いてJSONで出せるので、JSとの親和性が高いDBです。でもね。サーバでしか使えないんです。クライアントでも使えて、ついでにサーバとも同期できるようなMiniMongoとかあるんですが、微妙に使いづらいんです。Promiseベースで作られていないから。

それで、クラインアントとサーバを同期して、ついでに認証処理までやってくれるDBなんかあったら超便利なんですけど、Firestoreがまさにそれなんです。
検索クエリがMongoDBに比べれば貧弱ですが、サーバプログラムが一切いらず、DBのセットアップのなしで、クライアントプログラムさえ書けばある程度動いてしまうリアルタイムDBという魅力は凄まじいいものがあります。

MongoDBの代わりに使うのは、ちょっと難しい気はしますが、クライアントとサーバで同期できて、認証処理まで付いてくるとなると、Firestoreを使わないのはもったいない。しかも、個人レベルで使うのであれば、だいたいのことは無償枠で収まります。

そんなわけで、クライアントとサーバで同じデータを共有するプログラムは、Firestoreを使用しています。

Firestoreを使えば、なんとなくLineっぽいアプリも簡単に作れてしまうし、同じアカウントでデバイス間のデータを同期するプログラムも簡単に作れます。こんなものをイチから作るとなると、気軽には作れません。Firestoreさまさまです。

RxDB

クラインアントだけで、DBを使用したいときもあります。そもそもMongoDBはクライアントでは使えないわけですが・・・。そういうときは、PouchDBかRxDBを使用します。
RxDBは、内部でPouchDBを使ってるっぽくて、MongoDBのクエリを使用することもできます。

とりあえずオフラインでClientにデータを蓄えて、オンラインになったらデータを送信するみたいなものは、FirestoreかRxDBを使用しています。

Postgresql + Sequelizejs

最後にサーバのDBです。Nodejsでプログラムを書いていていたら、SQLゴリゴリより、NoSQLのようにサクッとJSONを保存したくなります。RDBでもそういうライブラリないのかと思っていたら、ありました!。Sequelizejsです。Sequelizejsは、Postgresql,MySQL,Sqlite3等、様々なRDBに対応したORMです。ORMとは

オブジェクト関係マッピング(英: Object-relational mapping、O/RM、ORM)とは、
データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。
オブジェクト関連マッピングとも呼ぶ。実際には、オブジェクト指向言語から使える「仮想」オブジェクトデータベースを構築する手法である。
オブジェクト関係マッピングを行うソフトウェアパッケージは商用のものもフリーなものもあるが、場合によっては独自に開発することもある。

というものらしい。平たく言えば、オブジェクトをいい感じでRDBで使えるようにしてくれるものだと思う。

僕は、割とSQLが好きなので、SQLを書かなくてもいいというのは魅力にはならないんですが、MongoDBように設計したDBを今更SQLで書き直すのはやっぱりしんどいです。Sequalizejsは、データをオブジェクトとして扱ってくれるので、MongoDBのような使用感でRDBに保存してくれます。なおかつ、テーブルのスキーマも、定義したモデルに従って自動で生成してくれるので、プログラムとSQLを2重管理しなくても良くなります。

なかなか素敵なライブラリ(今のところは)だったので、ブログでちゃんと書いてみようと思います。