Parse.com クラスの型、Relation と Pointer の違いについて

2015年2月4日 21:52

MBaaS(Mobile Backend as a Service)とは、モバイル・アプリケーションに必要なあれやこれ(あ、データストアとかユーザ管理システムとかね)をまとめて面倒見てくれる便利なクラウドサービスのこと。そして、その代表格が今回のお題(?)でもある Parse.com だ。この名前だと URL っぽいが、これがサービス自体の名称であり、サイトの名前でもあるようだ。

Parse.com の概要や具体的な利用法をここで紹介するのは紙幅の都合上とても無理なので、各自で調べるなりしていただくとして、ツイート中にある「型」ついてフォローしておく。

Parse.com をご存じない方のために最初に補足しておくと、いわゆるデータベースの世界とは微妙に用語が異なっているのがややこしいかもしれない。たとえば Parse.com では、データベースのテーブルに相当するものを「クラス」と呼ぶ。ひとつのクラスには列(col)と行(row)があり、新規クラスを作成したらまずは列を設定するところからスタートする。この列はカラムとかフィールドに相当するものであり、当然ながら型が存在する。が、一般的なデータベースとは違って比較的シンプルで自由度があるというか、たとえば文字列であれば単純に String として設定でき、長さなどは意識しなくて済む。

これら以外に Relation という型があり、こちらは他のクラスとリレーショナルな関係を……と早合点しがちであるが、じつは単に他のクラスと関連を作りたいだけであれば Relation ではなく Pointer という別の型のほうが都合がいい。いや、正確に言うとその関係が1対1か1対多か、はたまた多対多かで話が違ってくる。このあたりのことがいまいち理解できていないのだが、実際に Parse.com を業務に使ってみて身につけた「使い分け」的なところを解説しておきたい。

たとえばゲームのスコアを扱う Score というクラスがあり、各々のスコアを出したユーザを示すのが user というカラムだとする。この場合は Pointer で事足りる。たとえば今アクセスしているユーザのスコア一覧を取得する場合は、以下のようなコードになる(JavaScript SDK を想定。初期設定などは割愛)。

var Score = Parse.Object.extend('Score');
var query = new Parse.Query(Score);
query.equalTo('user', Parse.User.current());
query.find().then(function(scores) {
    // 取得後の処理
});

また別のケースとして、たとえば閲覧禁止リストみたいな BlackList というクラスがあり、そこにユーザを登録する場合などはカラム users の型を Relation にしたほうが何かと都合がいい。そして、このリストのひとつのレコード targetBlackList オブジェクトに newUser というオブジェクトを追加する場合は、以下のようになる。念のため補足するが、targetBlackList は BlackList クラスの、newUser は User クラスのインスタンスである。

var relation = targetBlackList.relation('users'); 
relation.add(newUser);
targetBlackList.save();

また、targetBlackList から閲覧禁止ユーザを取得したい場合は以下のとおり。

var relation = targetBlackList.relation('users');
relation.query().find().then(function(users) {
    // 取得後の処理
});