【问题标题】:Giving badges to users向用户发放徽章
【发布时间】:2012-03-10 09:40:29
【问题描述】:

我正在实施一个网站,我的用户将在完成某些目标或任务后获得徽章。
徽章也会有等级/颜色。例如,用户从 0 级青铜徽章开始,随着他们的进步,他们将获得 1 级青铜徽章,再过几个级别后,他们将获得 0 级银徽章,依此类推。

我正在构建数据库,但不确定如何将徽章连接到用户。

我的想法是为用户创建 1 个表,为徽章创建 1 个表,以及第三个将 UserID 连接到 BadgeID:

我关心的是优化。随着更多用户加入网站并获得徽章,访问表和搜索记录不会变慢吗?

我阅读了 here 中关于使用 Java 中的单例在服务器上定期运行脚本并根据规则检查用户状态以升级满足上限目标的徽章。 这种方法真的可扩展吗?还是我应该关注这个 Post

TIA

【问题讨论】:

  • “随着更多用户加入网站并获得徽章,访问表和搜索记录不会变慢吗? - 如果您有适当的索引,则不会。
  • @MitchWheat 你能进一步解释一下你的观点吗?

标签: database optimization scalability achievements badge


【解决方案1】:

随着更多用户加入网站并获得徽章,访问表和搜索记录不会变慢吗?

如果您的表被正确索引,则不重要。

这样想……如果百科全书的文章数量是百科全书的五倍,你会花更长的时间在百科全书中找到一篇文章吗?

不是真的;因为百科全书是按字母顺序索引的,所以即使文章数量显着增加,也不会花费太多时间来查找内容。但是,如果不编入索引,查找内容所需的时间会随着百科全书规模的增长而呈指数级增长。


鉴于您的问题和您链接的资源,我觉得您只关注“徽章”,可能会导致您错过更普遍的情况。

例如,如果徽章总是按顺序发放,您只需要记录某人最后获得的徽章;在这种情况下,他们一定已经获得了最后一个徽章之前的所有徽章。如果它们不是增量的,那么使用您描述的链接表可能会更好。

尝试用与数据库或数据建模相关的术语来描述您的问题,而不是专门与您的问题领域相关的术语(“徽章”)。这应该可以帮助您弄清楚您应该寻找什么样的信息,并最终引导您采取正确的行动。

【讨论】:

    【解决方案2】:

    现在,您可以实现它,就像您描述的那样(1 个徽章表、1 个用户表、1 个关系表)。

    GGG 只存储最后一个徽章的做法非常好,因为一个用户只能拥有一个徽章,并且徽章是按顺序发放的。但是,您不需要关系表。

    使用关系表,您可以同时向用户分配多个徽章(1:n 关系),例如四方徽章。

    如果你使用 MySQL,你应该使用 InnoDB。

    如果您遇到性能问题,您可以考虑在存储前设置某种缓存层,例如memcached 或仅使用 NoSQL DB 来获取徽章信息。但是当你不得不面对这些问题时,我会担心这些问题。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多