ニフクラmBaaSお役立ちブログ

スマホアプリ開発にニフクラmBaaS。アプリ開発に役立つ情報をおとどけ!

ポインターとリレーションの使い分けについて

f:id:mbaasdevrel:20180119171139p:plain

mBaaSのデータストアではクラス同士の繋がりを管理するためにポインターとリレーションという二つの機能を提供しています。どちらも似たような機能ですが、その使い方がそれぞれ違いますので、より深くデータストアを使いこなす際にはぜひ覚えてください。

ポインター

ポインターはクラス同士を1対1の関係で結びつけます。あるレコードの中に、別なクラスのオブジェクトIDを残すものです。例えば写真クラス(Photo)にユーザを結びつけることで、誰が写真の所有者かを管理できます。

const Photo = ncmb.DataStore('Photo');
const photo = new Photo();
photo
  .set('user', ncmb.User.getCurrentUser())
  .set('title', '公園の写真')
  .save()
  .then((data) => {
    // 写真アップロード完了
  })
  .catch(err => console.log(err));

そして、写真データを取得する際に include を使ってユーザデータも一緒に取得できます。

const Photo = ncmb.DataStore('Photo');
Photo
  .include('user')
  .fetchAll()
  .then((photos) => {
    // 写真の配列
    photos[0].user // ユーザの情報
  })
  .catch(err => console.log(err));

ただしユーザからの逆引きではできませんので注意してください。例えば user.photos といった指定はできません。

リレーション

リレーションはクラス同士を1対nの関係で結びつけます。あるレコードの中に、別なクラスの複数のオブジェクトIDを残すものです。例えばユーザにアップロードした写真を結びつけるといったことが可能です。

const user = ncmb.User.getCurrentUser();
const photos = new ncmb.Relation();
const Photo = ncmb.DataStore('Photo');
photos
  .add(new Photo)
  .add(new Photo);
user
  .set('photos', photos)
  .save()
  .then((data) => {
    // 写真の紐付け完了
  })
  .catch(err => console.log(err));

取得する場合、includeのような方法は使えません。検索対象はPhotoクラスになります。

const Photo = ncmb.DataStore("Photo");
Photo
  .relatedTo(ncmb.User.getCurrentUser(), "user")
  .fetchAll()
  .then((photos) => {
    // 写真の配列
  })
  .catch(err => console.log(err));

ポインターがユーザレコードの中にデータを持っていたのに対して、リレーションでは写真データを検索する形でユーザデータを指定するのが特徴です。

管理画面での違い

管理画面上ではそれぞれポインターを見る、リレーションを見ると言った違いがあります。どちらも関連づけを行ったクラス(写真またはユーザ)からしか辿れないので注意してください。

f:id:mbaasdevrel:20180119171052p:plain

まとめ

ポインターとリレーションは似たようなことができますが、データの保存方法や取得方法が異なります。クラス同士の関連性であったり、データをどう取り出すかによって使い分けるのがいいでしょう。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。