Backbone.js模型关系:加快性能

时间:2011-10-20 16:38:01

标签: javascript performance backbone.js coffeescript

我有三个关联的模型: Segments 每个都有两个 GeoPoints ,关联存储为 GeoPointOnSegments 。在服务器端,这是简单的Rails代码,具有has_many:through关系。在客户端,以下是我编写的Backbone代码。 (注意:我允许客户端创建数据然后批量上传;这就是为什么有一些逻辑来处理本地和服务器ID。)

我发现的问题是,当我有数百个模型时,这段代码非常慢。具体来说,它是geo_point.coffee中的以下行:

masterRouter.geo_point_on_segments.select ...

这是在每个GeoPointOnEntry模型上进行过滤,以便找到哪些连接到给定的GeoPoint。 (请注意,可以有多个Segment连接到GeoPoint。)有关如何提高性能的任何建议吗?

我的想法:

还有其他更好的想法吗?

geo_point.coffee

class App.Models.GeoPoint extends Backbone.Model
  name: 'geo_point'
  getGeoPointOnSegments: ->
    masterRouter.geo_point_on_segments.select (gpos) =>
      if @isNew()
        return gpos.get('geo_point_cid') == @cid
      else 
        return gpos.get('geo_point_id') == @id
    , this
  getSegments: ->
    _.compact _.map @getGeoPointOnSegments(), (gpos) =>
      gpos.getSegment() unless gpos.get('markedForDelete')
  getConnectedGeoPoints: ->
    _.compact _.flatten _.map @getSegments(), (s) =>
      s.getGeoPoints() unless s.get('markedForDelete')

geo_point_on_segment.coffee

class App.Models.GeoPointOnSegment extends Backbone.Model
  name: 'geo_point_on_segment'
  getGeoPoint: ->
    if local = masterRouter.geo_points.getByCid(@get 'geo_point_cid')
      return local
    else if server = masterRouter.geo_points.get(@get 'geo_point_id')
      return server
  getSegment: ->
    if local = masterRouter.segments.getByCid(@get 'segment_cid')
      return local
    else if server = masterRouter.segments.get(@get 'segment_id')
      return server

segment.coffee

class App.Models.Segment extends Backbone.Model
  name: 'segment'
  getGeoPointOnSegments: ->
    _.compact masterRouter.geo_point_on_segments.select (gpos) =>
      if gpos.isNew()
        return gpos.get('segment_cid') == @cid
      else if gpos.get('markedForDelete')
        return null
      else
        return gpos.get('segment_id') == @id
    , this
  getGeoPoints: ->
    _.map @getGeoPointOnSegments(), (gpos) =>
      gpos.getGeoPoint() unless gpos.get('markedForDelete')

1 个答案:

答案 0 :(得分:0)

我认为最好不要在Backbone中使用关系模型GeoPointOnSegment

我想要的结构是:

  • 每个点都有一个包含它所属的段的集合
  • 每个段都有一个带点
  • 的集合/数组

如果从JSON实例化数据时,您可以执行以下操作:

  • 初始化所有积分
  • 初始化所有细分
  • 对于每个GeoPointOnSegment,将点添加到段的集合,将段添加到点的集合。检索点和段的集合很快,因为它是由id(并由Backbone索引)。

此外,当您创建新细分时,您必须维护这些关联。

它是一个客户端索引,但已集成在模型中。