従来のリレーショナル DB(以下、RDB)を好む自分にとって嬉しい時代になってきています。
大した情報ではないですが、たまたまこの記事にたどり着いた人が RDB の良さを振り返るきっかけとなることを期待して書きます。
RDBMS の実績
まずは RDB / RDBMS をより敬いたくなる話。
ブログ: リチャード・ヒップとのSQLiteの秘話
下の引用はこのリンク先からです。
SQLite
SQLiteは至る所にあります。ウェブブラウザにも、携帯電話にも、おそらく車の中にも、そして旅客機の中にも間違いなく存在します。iMessagesやWhatsAppのメッセージが保存されているのもSQLiteです。
テストカバレッジを90または95%にするのは非常に簡単です。最後の5%を獲得するのは本当に大変で、そこにたどり着くまでに約1年かかりましたが、そこまで到達すると、Androidからのバグレポートを受け取ることはなくなりました。
(中略)
それ以来、ITは順調に進んでいます。これはとても大きな違いでした。それからの8~9年間は、本当に何のバグもありませんでした。
あらゆる場所で使われていて信頼性が非常に高いですね。
この記事を読むまで、Flutter でアプリを作るときに SQLite を使ったり別のものを使ってみたりしていましたが、もう全部 SQLite でいいと思うようになりました。
PostgreSQL
彼は膨大な数のSQL文を作成し、手に入る限りのすべてのデータベースエンジンと比較しました。私たちは全員が同じ答えを得られるようにしたかったのですが、彼はPostgresを除いて、SQLiteを含む彼が試したすべてのデータベースエンジンをセグメンテーションフォールトさせることに成功しました。Postgresは常に実行され、正しい答えを出しました。私たちは、その中に欠点を見つけることはできませんでした。Postgresの人たちは、私たちの努力が足りなかっただけだと言っています。
常に正しい Postgres…。優等生なんですね。
SQLite もその後に上記のとおりデバッグが行われてエラーがなくなったということで、今は同等の堅牢性があるのだと思います。
設計面
ドキュメント指向の DB をここ一年半ほど使い、RDB より設計が難しく思いました。
DBMS の仕様の他に料金の都合もあるのですが、読み書きを抑える設計と非正規化を徹底しなければならないのは苦しみがありました。
そんな苦労をした後には RDB の良さをより認識できます。
また、当初にない機能を後で追加する可能性を考えるときも RDB は不安が少ないです。
非正規形が前提の NoSQL では、必要な箇所全部にデータを追加しないといけないでしょうか。
そのためのスクリプトか何かも必要になりそうです。
一方、RDB では既存データを SQL で結合するだけでどうにかなることが多いです。
低価格な RDB
以前は高いサービスしかなくて、費用を気にして自分でサーバを立てると、そのメンテナンスという別のコストが生じていました。
それがここ数年で変わってきて、安価なサービスが現れています。
- Supabase
- Nhost
- PlanetScale
- など...
例えば Supabase では、PostgreSQL が使えて Auth / リアルタイム DB / Storage / Edge Functions など込みでたったの 25 米ドルです。
一部は従量制ですが、DB では外向きの通信が月に 50 GB を超えなければ追加料金は発生しません。
無料のプロジェクトは二つまでで、停止すればさらに作れます。
個人開発のアプリの一部は開発時にこのようなサービスがなかったので VPS を利用しました。
今から移すのは面倒なので、開発当時に存在していなかったのが残念です。
急に再注目されている SQLite
今年になって SQLite を用いたツールが続々と登場しました。
Litestream
SQLite をレプリケートできるツールです。
変更が S3 等のストレージに継続的にストリーミングされます。
バックアップ用かなと思います。
安全・簡単にバックアップできれば、運用管理の負担は一つ減って安心感は増すので、SQLite をアプリのバックエンドに用いやすくなりそうです。
これのリリース後に作者は Fly.io に所属して改良していくことになりました。
Fly.io の後ろ盾があるツールということで、今後も期待できます。
LiteFS
https://github.com/superfly/litefs
作者が Litestream と同じです。
こちらは FUSE ベースのファイルシステムで、クラスタ間でレプリケートできるとのことです。
Litestream と違って read replica が可能になるものだと思われます。
CloudFlare D1
https://blog.cloudflare.com/ja-jp/introducing-d1-ja-jp/
クラウドのサービスなので上の「低価格な RDB」に該当しますが、SQLite なので別記としました。
CDN のエッジにデプロイされるというのがとても新しいです。
PocketBase
Supabase に似ているけれど DB は Postgres ではなく SQLite です。
自分でホストしないといけませんが、デプロイに限って言えばシングルバイナリで非常に簡単です。
余談ですが、Litestream も LiteFS も PocketBase も Go 製です。
Go はサーバで動かすツールに向いていていいですね。
ハンズオンの記事を書きましたので、気になる方はどうぞ。
さいごに
RDB を時代遅れと見る人もいる一方で、良さを見直してツールを生み出す人もいるのが面白いです。
また個人開発者としては、安価で使いやすい方法が増えていて嬉しいです。
業務では、モバイルアプリ開発のプロジェクトに参加すると NoSQL が採用されていることが多く、選定理由は向き不向きを考慮した結果でもなく NoSQL しか知らないことだったりするので、両方を比較して判断できる人が増えてほしいと思います。