【问题标题】:Should I use an array of pointers or a PFRelation? (parse.com)我应该使用指针数组还是PFRelation? (parse.com)
【发布时间】:2014-11-30 22:54:20
【问题描述】:

据我所知,您可能使用指针数组的唯一原因是为了保持排序,因为 PFRelation 实例不支持排序。否则,它们的行为似乎相同,尽管 PFRelation 更具可扩展性,并且还有一个漂亮的内置“查询”方法,可以将查询限制为 PFRelation 实例中的对象,这有时非常有用。

PFRelation *relation = ...
PFQuery *query = [relation query];

上下文:我正在构建一个应用程序,其中每个 PFUser 实例都有许多 TennisGame 实例(可能是一个很大的数字),并且 TennisGame 实例有许多 PFUser 实例(2 个或 4 个,具体取决于无论是单打比赛还是双打比赛)。

问题:在 parse.com 上组织我的数据的最佳方式是什么?我正在考虑我的 PFUser 类(到 TennisGame 实例)中的 PFRelation,以及我的 TennisGame 类(到 PFUser 实例)中的一个数组或 2 或 4 个指针。但我需要两者吗?如果没有,哪个最好?

【问题讨论】:

    标签: parse-platform scalability pfrelation


    【解决方案1】:

    问题在于您如何访问您的数据。对于您的情况,您可以考虑以下问题:

    • 您是否需要在获得用户时包含用户的 TennisGames?如果是,则数组支持 include 查询。您不能对关系执行include,您需要再执行一次查询才能访问用户的 TennisGames。
    • 一个用户最多可以拥有多少个 TennisGames?如果它可能超过 100(Parse 推荐的限制),最好使用关系。因为数组无法扩展到大型关系。
    • 正如您所指出的,顺序对您来说很重要吗?如果是,则数组支持顺序。
    • 再次如您所说,如果您对数据子集感兴趣,关系可以限制查询,而数组则不能。

    我建议您观看 this video 关于 Parse 开发人员时代的 Parse 关系。

    此外,您不需要保持双方的关系。这会使创建和更新它们变得更加复杂。

    【讨论】:

    • 感谢 knshn。我有一个视图,我需要加载用户的游戏,按日期排序。所以看起来 PFRelation 是实现这一目标的最简单方法。但是另一种方法是查询整个 TennisGame 类,使用 whereKey:@"players_array" equalTo:[PFUser currentUser] 我不确定当可能有数十万个 TennisGame 实例时这是否效率太低
    • 如果你找到了这个页面,强烈推荐你看看视频,非常全面
    【解决方案2】:

    knshn 的回答不好,因为它假设必须在任何时候使用 PFRelation,因为性能问题,“MANY”方有超过 100 个关系。

    这不是真的,因为您可以使用“指针关系”创建一对多关系,而 Parse 可以处理 100 多个关系没有问题。或者当一侧的关系超过100个而另一侧的关系少于100个时,它甚至可以有效地处理“数组关系”的多对多关系。所以正确的答案应该提到拥有超过100个关系成为问题仅在使用“数组关系”时,即。制作一个包含 100 多个项目的数组并将其设置为一个对象。

    所以回到最初的问题,我建议你在 TennisGame 实例中拥有一组 PFUser 玩家,因为每个游戏一次只有 2 或 4 名玩家时间,或者至少肯定少于 100。

    因此,如果您想从特定的TennisGame 实例中获取PFUser 玩家,则必须执行如下查询:

    PFQuery *query = [PFQuery queryWithClassName:@"TennisGame"];
    [query includeKey:@"players"];
    [query getObjectInBackgroundWithId:tennisGameId block:^(PFObject *tennisGame, NSError *error) {
        if (tennisGame) {
            tennisGame[@"players"];
        }
    }];
    

    接下来,如果要获取当前用户玩过的所有游戏,按日期排序,可以执行如下查询:

    PFQuery *query = [PFQuery queryWithClassName:@"TennisGame"];
    [query addDescendingOrder:@"createdAt"];
    [query whereKey:@"players" equalTo:[PFUser currentUser]];
    [query findObjectsInBackgroundWithBlock:^(NSArray *tennisGames, NSError *error) {
        // do whatever you need with the results
    }];
    

    最后,您可能会问:“等等!如果玩家玩了超过 100 场比赛,这不会是性能问题吗?”答案是否定的,因为这只是数组的问题,而不是查询的问题。如果将游戏作为数组保存在PFUser 实例中,而不是将玩家数组保存在TennisGame 实例中,这将是一个问题。此外,PFRelation 也是某种查询,因此推荐使用它来检索大量对象。

    奖励:何时使用PFRelation 当您需要 A-LOT-to-A-LOT 关系时,这是理想的选择,因此在社交网络应用程序上使用 PFRelation 表示“关注者”之类的东西是有意义的,因为每个帐户可以有超过 100 个“关注者”,每个帐户可以是 100 多个其他帐户的“关注者”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2016-04-10
      相关资源
      最近更新 更多