BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース RealmがNode.jsのためのオブジェクトデータベースをリリース

RealmがNode.jsのためのオブジェクトデータベースをリリース

原文(投稿日:2016/11/22)へのリンク

RealmがNode.jsのためのオブジェクトデータベースをローンチした。これを使うと、モバイル開発者は事前にデータを入力したRealmを作成し、クライアントに送信することができる。

オープンソースデータベースのリリース発表で、Realm技術チームは、Realm Node.jsで開発者ができることを次のように述べている。「以前からオブジェクト指向でオブジェクトを扱っていたのと同様に、簡単にオブジェクトとしてデータを扱うことができます。異なるのは、オブジェクトがディスクに簡単に、かつ効率的に永続化されるということです。JSONにシリアライズする必要はなく、テーブルに表示するためにORMを使う必要もありません。」

Realmは2年前に、SQLiteやCore Dataなどのデバイス上のテクノロジの代替品を提供するために立ち上げられ、初期のiOSデータベースに続いて、Android用とReact Native用のデータベースをリリースしている。Realm Node.jsは、Node.jsにおける初のオブジェクトデータベースになる。

Realmのサーバー上で動くバージョンを作る動機は、Realm Mobile Platformをリリースしてから、チームがプラットフォーム用のNodeインタフェースの問い合わせを受けるようになったことだった。

Realm Node.jsはマルチバージョン同時実行制御(Multiversion Concurrency Control)を使って、「スレッドとプロセス間に置けるデータベースへの並列アクセスを提供」する。つまり、読み取りと書き込みの両方が、一貫したデータベースのビューを保持するということだ。これを連係させるため、Realmは通知の仕組みを使って、書き込みトランザクションが完了すると、アクセッサを更新する。開発者は、通知の仕組みとともに通知のAPIを使って、書き込みトランザクションの完了時にアクセッサを更新できる。

以下のサンプルコードでは、Express Webフレームワークを使ってHTTPエンドポイントを作成し、Winstonを使ってリクエストに関する情報を記録する。

var express = require('express'),
    util = require('util'),
    winston = require('winston');
    RealmWinston = require('./winston-realm').Realm;

var app = express();

// カスタムのWinstonトランスポート、RealmWinstonを使う
// ログデータをwinston.realmに書く
winston.add(RealmWinston, {});

app.get('/', function (req, res) {
  res.send('Hello World!');
  winston.info('Handled Hello World');
});

app.use(function (req, res, next) {
  res.status(404).send('Sorry can not find that!');
  winston.error('404 Error at: ' + req.url);
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

以下のサンプルコードでは、Realmにログデータを保存することで、別のNodeプロセスを開始して、変更に反応するRealmリスナーを登録している。

'use strict';

var Realm = require('realm');

let winstonRealm = new Realm({
  path: 'winston.realm'
});

// エラーレベルのログメッセージを出力するためにリスナーを登録する
winstonRealm.objects('Log').filtered('level = "error"').addListener((logs, changes) => {
  changes.insertions.forEach((index) => {
    let log = logs[index];
    console.log(log.message);
  })
});

Realmのチームは次のように説明する。「リスナーはRealmのコレクション通知を利用します。コレクション通知を用いると、追加・削除、または変更されたオブジェクトに対応するインデックスを知ることができます。サンプルコードでは、エラーレベルのすべてのログを取得するクエリにリスナーを追加し、ログメッセージをコンソールに出力しています。」

Node.jsのためのオブジェクトデータベースについて、JavaScriptコミュニティの人たちがいくつか質問をしている。Hacker Newsのディスカッションでは、あるユーザーが「これは新しい同期の仕組みを使って動いているのですか?」と質問した

RealmのプロダクトディレクターであるAdam Fish氏はこう答えた。「このバージョンには同期機能は含まれておらず、Realmローカルで使っているだけです。プロセス間通信など独自の価値があると考えているので、Node.jsコミュニティに公開したいと思っています。」

同期に関するさらなるアップデートが「まもなく」やってくるだろう、と彼は付け加えた。

Realm Node.jsはRealmの純粋なJavaScript実装なのか、それともRealmプロセスのJavaScriptラッパーなのかという質問に対しては、Realm Coreを使っているが、JavaScript APIを公開していると説明した

そして最後に「パフォーマンスはどうですか? SQLに張り合えるとは思えません」という質問に対しては、サーバサイドで使われる他のSQLデータベースに対するきちんとしたベンチマークは行っていない、RealmはSQLiteと比較されることが多いと答えた。Androidデータベースのベンチマークはここから入手できる

Realm Node.jsはフリーの完全にオープンソースのリポジトリとして、NPMから入手できる。

 
 

Rate this Article

Relevance
Style
 
 

この記事に星をつける

おすすめ度
スタイル

BT