Магистрально-реляционная система имеет много лучших практик

Я новичок в Backbone-relational, я не уверен, как правильно использовать HasMany.

У меня есть модель Parent, у которой много children (под «многими» я подразумеваю тысячи детей). Чтобы избежать проблем с производительностью, я запрашиваю дочерние элементы по их внешнему ключу: /child/?parent=1 вместо создания огромного списка child_ids в Parent. Но, похоже, это не так, как работает Backbone-relational.

Поэтому мне интересно, как правильно с этим справиться.

1. Измените мой json API, чтобы включить список дочерних идентификаторов в родительский, а затем отправьте тысячи идентификаторов в качестве реляционной рекомендации Backbone:

url = function(models) {
  return '/child/' + ( models ? 'set/' + _.pluck( models, 'id' ).join(';') + '/' : '');
}
// this will end up with a really long url: /child/set/1;2;3;4;...;9998;9999

2, переопределить многие методы в Backbone-relational, пусть он справится с этой ситуацией. Моя первая мысль:

relations: [{
  collectionOptions: function(model){
    // I am not sure if I should use `this` to access my relation object 
    var relation = this;
    return {
      model: relation.relatedModel,
      url: function(){
        return relation.relatedModel.urlRoot + '?' + relation.collectionKey + '=' + model.id;
      }
    }
  }
}]
// This seems work, but it can not be inherent by other model
// And in this case parent will have am empty children list at beginning.    
// So parent.fetchRelated() won't fetch anything, I need call this url my self.

3. Используйте только Backbone-relational в качестве Store, затем используйте Collection для управления отношениями.

4, какой-то другой волшебный способ или шаблон или каркасная структура

Спасибо за помощь.


person xzhang    schedule 11.04.2013    source источник
comment
По моему опыту работы с магистрально-реляционными, я не думаю, что он будет хорошо работать с тысячами моделей. У меня были серьезные проблемы с производительностью при работе с сотнями моделей, особенно при их загрузке. Backbone-relational довольно болтлив с запускающими событиями, и в зависимости от того, сколько свойств у вас есть в вашей модели, в конечном итоге это будут десятки событий, запускаемых для каждой модели, умноженных на тысячи моделей.   -  person Edward M Smith    schedule 03.07.2013
comment
Мне любопытно, как ты в конце концов справился с этим.   -  person Chris Camaratta    schedule 05.08.2013
comment
это то, как я в конечном итоге использую, не очень чисто, но пока работает.   -  person xzhang    schedule 07.08.2013
comment
Если вы знаете, что вам нужно получить все, я бы выбрал обратную связь (дочерний элемент знает своего родителя), а затем выбрал бы всех дочерних элементов с помощью отдельной коллекции, которая неявно заполняет базовое реляционное хранилище и, следовательно, создает вашу иерархию с помощью одного звонок на сервер.   -  person David    schedule 10.10.2013


Ответы (1)


Вот решение, которое у меня есть в моем текущем проекте. Обратите внимание, что у Project много комментариев, событий, файлов и видео. Эти отношения и их обратные отношения определены на этих моделях:

Entities.Project = Backbone.RelationalModel.extend({
    updateRelation: function(relation) {
        var id = this.get('id'),
            collection = this.get(relation);

        return collection.fetch({ data: $.param({ project_id: id }) });
    }
});

У меня есть конечная точка REST, настроенная на прием параметров, которые действуют как последовательные предложения WHERE. Итак, project.updateRelation('comments') отправит запрос /comments?project_id=4. У меня есть дополнительная логика на стороне сервера, чтобы отфильтровать то, что пользователь не имеет права видеть. (серверная часть Laravel, кстати)

person Michael Cordingley    schedule 10.12.2013