روابط - Backtory.Relation

پیش‌نیازها

  1. در صورتی که با سرویس پایگاه‌داده آشنایی ندارید، به معرفی سرویس پایگاه‌داده مراجعه کنید.
  2. در صورتی که هنوز در پنل توسعه‌دهنده خود تنظیمات لازم برای سرویس پایگاه‌داده خود را انجام نداده‌اید، به تنظیمات پنل مراجعه کنید.
  3. در صورتی که ایده‌ای راجع به سرویس Cloud Code ندارید، به معرفی سرویس رایانش مراجعه کنید.
  4. در صورتی که هنوز با SDK سرویس رایانش برای اتصال به سایر سرویس ها آشنایی ندارید یا آن را راه اندازی نکرده اید، به راه اندازی SDK سرویس رایانش مراجعه کنید.

سه نوع رابطه داریم. روابط one-to-one این امکان را فراهم می آورند که یک شیء را به یک شیء دیگر متصل کنیم. روابط one-to-many این امکان را فراهم می آورند که یک شیء به چندین شیء دیگر مرتبط شود؛ و در نهایت روابط many-to-many که امکان روابط پیچیده بین اشیا را فراهم می آورد. در بکتوری شما به چهار روش می توانید رابطه بین اشیا ایجاد کنید.

روابط ONE-TO-MANY

برای این که بفهمید بهتر است روابط one-to-many را با استفاده پوینتر ها پیاده سازی کنید یا با استفاده از آرایه ها، باید فاکتور های مختلفی را در نظر بگیرید. اولین فاکتور این است که چه تعداد شیء در رابطه سهیم هستند. اگر بخش “many” رابطه امکان دارد تعداد زیادی (۱۰۰ یا بیشتر) شی در برگیرد، شما می بایست از پوینتر ها استفاده کنید. اما اگر تعداد اشیا کم می باشد (کم تر از ۱۰۰)، استفاده از آرایه ها ممکن است راحت تر باشد مخصوصا اگر بخواهید هم زمان با این که یک شیء را بازیابی می کنید همه ی اشیای مرتبط با آن را نیز بازیابی کنید. (بخش “many” در یک رابطه “one-to-many”)

با استفاده از پوینتر

فرض کنید در یک بازی می خواهیم امتیاز ها و achievment های یک بازیکن را به ازای هر بازی داشته باشیم و ذخیره کنیم. در بکتوری می توانید این اطلاعات (امتیاز و دستاوردهای بازیکن به ازای هر بازی) را در یک شیء Game ذخیره کنیم. اگر نرخ پیروزی در بازی زیاد باشد، ممکن است لازم باشد برای یک بازیکن هزاران شیء Game نگه داریم. برای مواردی نظیر این که تعداد اشیای روابط بسیار زیاد است، پوینتر ها گزینه مناسبی هستند. فرض کنید می خواهیم یک شیء از بازی Game را به یک بازیکن خاص مرتبط کنیم. می توانیم این کار را به شکل زیر انجام دهیم.

var player = new Backtory.Object.extend("Player");
var game = new Backtory.Object.extend("Game");
game.set("player", player);

اگر بخواهیم همه ی game هایی را پیدا کنیم که توسط بازیکنی خاص بازی شده اند کافیست بنویسیم:

var Game = Backtory.Object.extend("Game");
var query = new Backtory.Query(Game);
query.equalTo("player", player);

و اگر بخواهیم بفهمیم یه بازی خاص توسط چه بازیکنی بازی شده است، کافیست بنویسیم.

// say we have a Game object
var game = ...

// getting the player who played the Game
var player = game.get("player");

دقت کنید که اگر هنگامی که یک شیء game را بازیابی کردید (مثلا توسط query.get)، فیلد “player” را include نکرده باشید، پوینتر مربوط به بازیکن به طور کامل بازیابی نمی شود و صرفا id_ بازیکن همراه با شیء game دریافت می شود. اگر می خواهید به اطلاعات بازیکن مرتبط دسترسی داشته باشید یا باید هنگام query زدن، فیلد “player” را include کنید و یا این که بعد از بازیابی متود fetch را برای بازیکن فراخوانی کنید.

var Game = Backtory.Object.extend("Game");
var query = new Backtory.Query(Game);

// method 1: use include
query.include("player");
query.find({
    success: function(game) {
        var playerName = game.get("player").get("name");
    }
});

// method 2: call fetch
query.get("sampleIdGoesHere", {
    success: function(game) {
        var player = game.get("player");
        player.fetch({
            success: function(player) {
                var playerName = player.get("name");
            }
        });
    }
});