データベースを構築するのをやめよう
(sqlsync.dev)データ管理の複雑さ
- フロントエンドエンジニアは、APIデータをキャッシュする必要性に気づくようになる。
- 最初は単純なデータ保存から始まるが、機能要望が増えるにつれて、データキャッシュ、手動インデックス、楽観的ミューテーション(optimistic mutations)、再帰的なキャッシュ無効化などを実装することになる。
- これらの機能はデータベースの内部動作に似ており、複雑なフロントエンドアプリケーションでは、結局ドメイン特化型のデータベースを作ることになる。
キャッシュの基本
- APIリクエストの結果をローカル変数に保存することから始まる。
- 宣言的フレームワークを使うWebアプリケーションでは、不要なAPIリクエストを防ぐためにデータを変数に保存する。
- キャッシュをより高いレイヤーに移したり、UIツリーの外部に移動したりすることが次の段階となる。
インデックスによる高速化
- データを特定の方法で整理することで、アプリケーションの作業を減らし、ユーザー体験を向上させられる。
- フロントエンドのデータ最適化が、データベースストレージの内部動作に似ていることに気づく。
- IDごとにデータを保存し、日付ごとに項目を素早く取得できるインデックスを作成して、データ構造を改善する。
楽観的ミューテーション
- サーバーの応答を待たずに、ローカルで特定の操作の効果をシミュレートすること。
- ユーザーインターフェースが即座に反応しているように見せられるが、サーバーと異なる結果になった場合は、UIが変更をロールバックしなければならない。
- クライアントとサーバー間でロジックを複製すること、非同期エラーを処理すること、アプリケーションの再起動をまたいで変更を調整することなどの課題がある。
再帰的なキャッシュ無効化
- データはキャッシュの複数箇所に現れるため、更新後にサーバーと一致するようキャッシュを正しく無効化する必要がある。
- UIは、キャッシュのどの部分が各ミューテーションに関連しているかを把握していなければならず、これは規模が大きくなるほど脆くなりうる。
- 楽観的ミューテーションと組み合わせると、クライアント側でサーバー変更を予測するためにサーバーロジックを複製することがさらに難しくなる。
データベースを構築中?
- 十分に複雑なフロントエンドアプリケーションでは、結局多くのデータ管理機能を自前で構築することになり、その結果、ユーザーを喜ばせビジネス課題を解決するための時間が奪われる。
- フロントエンドに最適化されたデータベーススタックという代替案を提示する。
SQLSync の紹介
- SQLiteをベースにした、フロントエンドに最適化されたデータベーススタックであるSQLSyncを開発した。
- SQLSyncは、データ管理の問題を解決し、開発者がアプリケーション独自の機能に集中できるよう設計されている。
- SQLSyncは、耐久性のあるキャッシュ、SQLiteのフル機能、楽観的ミューテーション、スマートなキャッシュ無効化、リアクティブクエリを提供する。
GN⁺の意見
この記事で最も重要なのは、フロントエンドアプリケーションの複雑さが増すにつれて、開発者がデータベースに似た機能を自前で実装するようになる現象です。こうした作業は開発者の時間を消耗させ、実際にユーザーへ価値を提供する機能開発から遠ざけてしまいます。SQLSyncのようなフロントエンド最適化データベーススタックは、こうした問題を解決しようとする革新的なアプローチを提示しています。この記事が興味深いのは、既存のデータ管理方式にある根本的な問題を指摘し、開発者がより効率的に作業できる新しい解決策を模索している点です。
1件のコメント
Hacker News の意見
プロジェクト制作者である友人への理解
過去の会社でのプロジェクト管理ソフトウェア経験
SPA を捨てれば消える問題
SQLSync 制作者の意見
ユーザーに現実と異なるメンタルモデルを与えないこと
測定できるものは管理されるという原則とサンクコストの誤謬
クライアントとサーバー間の状態同期の問題
ORM ライブラリとの比較
フロントエンドとバックエンドのデータベースの違い
SignalDB による類似の試み