SurrealDB入門:PostgreSQL、Redis、Neo4jをこれ一つで代替できるのか?

Database tutorial - IT technology blog
Database tutorial - IT technology blog

「フランケンシュタイン構成」という悩み

フルスタックエンジニアなら、1つのプロジェクトで4〜5種類のデータベースを使い分ける状況に馴染みがあるでしょう。リレーショナルデータにはPostgreSQL、キャッシュにはRedis、検索にはElasticsearch、そしてネットワーク関係の処理が必要になればNeo4jを追加するといった具合です。このような肥大化したインフラを維持するのは非常に時間がかかります。特にスピード感が求められるMVP(実用最小限の製品)開発においては、膨大なリソースを浪費することになります。

実際、従来のデータベースは特定のタスクに特化していることが多いです。MySQLやPostgresは厳格ですがスキーマの柔軟な拡張が難しく、逆にMongoDBは自由な保存が可能ですが、複数のテーブルをJOIN(lookup)する必要がある場合、パフォーマンスが急激に低下します。その結果、データロジックを処理するためだけにコードが非常に複雑になってしまいます。

この複雑さは、バラバラのピースを無理やり繋ぎ合わせようとしていることから生じています。モダンなアプリケーションがリアルタイム性、柔軟なスケーリング、多様な構造を求めている今、統合されたソリューションが必要です。そこで登場したのが、この問題を解決するSurrealDBです。

SurrealDBとは?なぜ開発者の間で話題なのか?

SurrealDBは単なるデータベースではなく、マルチモデルデータベース(Multi-model Database)です。Rustで書かれており、わずか20〜30MB程度の単一のバイナリファイルに軽量にパッケージ化されています。その強みは、あらゆるデータベースの長所を兼ね備えている点にあります:

  • リレーショナル (SQL): Postgresを使っている時のように、SELECT、JOIN、GROUP BYをそのまま利用できます。
  • ドキュメント (NoSQL): JSONを柔軟に保存でき、スキーマを定義するかどうかは自由です。
  • グラフ: レコード同士をグラフ関係で接続します。従来のJOINのような遅延を発生させずに、数百万ものコネクションをクエリできます。
  • リアルタイム: Live Queriesが組み込まれています。複雑なSocket.ioの設定なしで、データに変更があった瞬間にクライアントへ自動プッシュされます。

中継役としてのバックエンドAPI(Node.jsやGoなど)を書く代わりに、SurrealDBはフロントエンドから直接接続することも可能です。レコード単位での詳細な権限管理(Permissions)システムにより、データの安全性も確保されています。

SurrealDBを一瞬でインストールする方法

Rustで最適化されているため、SurrealDBは非常に軽量で、瞬時に起動します。

1. macOS/Linuxに直接インストールする

おなじみのcurlコマンドを使って最新版をインストールします:

curl --proto '=https' --tlsv1.2 -sSf https://install.surrealdb.com | sh

2. Dockerで実行する(推奨)

クリーンな環境を保ちたいなら、Dockerが最適です。一行のコマンドでデータベースサーバーが立ち上がります:

docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start --user root --pass root

サーバーはポート8000で待機します。root/rootのアカウントですぐにアクセス可能です。

SurrealQLによる操作

SurrealQLは、馴染みのあるSQLとモダンな考え方を組み合わせた言語です。複雑なデータ操作を非常に直感的に行うことができます。

データの高速作成

CLIにアクセスして試してみましょう:

surreal sql --endpoint http://localhost:8000 --user root --pass root --ns test --db test

柔軟なフィールドを持つユーザーレコードを作成してみます:

-- 新規ユーザーの作成
CREATE user:admin SET 
    name = 'ITブログ ゼロから',
    tags = ['rust', 'database', 'surrealdb'];

-- データの取得
SELECT * FROM user;

グラフクエリ:JOINの遅延にさらば

「いいね(Like)」機能を実装すると想像してみてください。従来のSQLでは中間テーブルが必要ですが、SurrealDBでは2つのレコードを繋ぐ「エッジ(edge)」を作成するだけです:

-- 記事の作成
CREATE article:post1 SET title = 'SurrealDB 101';

-- ユーザーから記事への「like」リレーションを作成
RELATE user:admin->like->article:post1 SET time = time::now();

-- 記事に「いいね」したユーザーの名前一覧を取得
SELECT ->like->user.name FROM article:post1;

上記のコマンドは、通常のJOINがO(log n)であるのに対し、O(1)の計算量で実行されます。これはデータが数百万行に達した時に極めて重要になります。

Live Queries:バックエンド不要のリアルタイム処理

以前なら、通知機能を実装するためにPostgresのLISTEN/NOTIFYを使い、それをSocket.io経由で伝える必要がありました。SurrealDBなら、すべてが一つのクエリで完結します:

LIVE SELECT * FROM article WHERE tags CONTAINS 'rust';

誰かがRustに関する新しい記事を追加すると、クライアントは即座に通知を受け取ります。この機能により、バックエンド側のボイラープレートコードを最大60%削減できます。

実践的な視点:今すぐSurrealDBを採用すべきか?

非常に強力ですが、実際のニーズに基づいて慎重に検討する必要があります:

  1. スタートアップ/MVPプロジェクト: 迷わずこれを選んでください。インフラ構築やAPI定義にかかる時間を数週間単位で節約できます。
  2. ソーシャル/IoTアプリケーション: 複雑な関係性や絶え間なく流れてくるデータを扱うアプリは、グラフ機能とLive Queriesの強みを最大限に活かせます。
  3. 本番環境(Production)での注意点: SurrealDBはまだ若いプロジェクトです。コミュニティはPostgresやMySQLほど大きくありません。GUIツールやORMもまだ発展途上の段階です。

特筆すべきは、SurrealDBが無限のスケーラビリティを備えている点です。単一のファイルで実行することも、コードを変更せずにTiKVをストレージエンジンとして使用した分散クラスタを展開することも可能です。

Lời kết

SurrealDBは、古くからの名前に支配されていたデータベースの世界に、まさに新しい風を吹き込みました。SQL、NoSQL、グラフを一つにまとめることで、インフラとの格闘ではなく、プロダクトのロジックに集中できるようになります。

もし、たった一つのWebアプリを動かすために何十ものサービスを設定することに疲れているなら、週末にSurrealDBを試してみてください。もしかしたら、それがあなたの次のプロジェクトの「秘密兵器」になるかもしれません。

Share: