【问题标题】:Filtering a collection vs. several collections in Backbone?在 Backbone 中过滤一个集合与几个集合?
【发布时间】:2012-05-10 17:02:28
【问题描述】:

什么时候过滤一个集合而不是在 Backbone 中有多个集合?

例如,考虑一个音乐库应用。它会有一个显示流派的视图和另一个显示所选流派音乐的视图。

您更愿意用所有音乐制作一个庞大的集合然后过滤它还是几个较小的?

只有一个集合可以让您添加用于按其他属性过滤的功能,但假设您有大量音乐:如果用户只需要一种类型,您如何防止在应用程序启动时将其全部加载?

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    我认为最简单的方法是拥有一个通用的唯一集合,智能地,fetch 一个已经按流派过滤来自服务器的数据:

    // code simplified and no tested
    var SongsCollection = Backbone.Collection.extend({
      model: Song,
      url: function() {
        return '/songs/' + this.genre;
      },
      initialize: function( opts ){
        this.genre = opts.genre;
      }
    });
    
    var mySongsCollection = new SongsCollection({ genre: "rock" });
    mySongsCollection.fetch();
    

    您必须让此集合在用户更改所选类型时从服务器重新获取数据:

    mySongsCollection.genre = "punk";
    mySongsCollection.fetch();
    

    【讨论】:

    • 这听起来很诱人,但如果我需要添加另一个搜索过滤器,比如艺术家姓名,该怎么办?我如何告诉服务器 /songs/elvis 中的参数是艺术家姓名,但 /songs/rock 是流派? (是的,我是一个完全休息的菜鸟)
    • 您可以通过多种方式做到这一点。第一个是每个端点都有一个单独的端点,因此您将拥有 /songs/artist/elvis 和 /songs/genre/rock。另一种方法是使用查询字符串参数,因此您可以使用 /songs/?artist=elvis&genre=rock。我的首选是第一个选项,因为它提供更清晰的 URL。
    【解决方案2】:

    这主要是一个设计选择,但我的投票是选择一个松散地反映存储集合的数据库的方案。

    如果您可能将数据存储在 SQL 数据库中,您很可能会为 songs 和 genres 提供单独的表。您可能会通过歌曲表中的genre_id 列连接它们,或者(如果歌曲可以有多个流派)根据单独的song_genres 连接表连接它们。因此,您可能需要单独的集合来代表流派和其中的歌曲。在这种情况下,backbone-relational 可能是非常有用的工具,可以帮助他们保持正确。

    如果您将信息存储在任何类型的关系/键值/文档存储中,那么直接将流派与歌曲一起存储并进行相应过滤可能是有意义的。在这种情况下,您最终可能会以这样一种方式存储文档键/查询,以便您可以直接访问歌曲(例如,通过 songs)或通过流派(例如,genre:genre_id/songs)访问歌曲。如果这是你走的路,那么简单地创建一个庞大的歌曲集合并计划在应用程序和数据库环境中设置相应的过滤器可能会更方便。

    【讨论】:

    • 谢谢,这些听起来像是做出选择的有力论据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2017-04-12
    相关资源
    最近更新 更多