【问题标题】:Best way to store Badge criteria?存储徽章标准的最佳方式?
【发布时间】:2009-02-07 01:53:37
【问题描述】:

我一直在考虑如何在新网站上实现类似于 SO 的徽章功能。存储徽章标准的最佳方式是什么?

两个想法:

  • 所有代码
  • '第二个系统' - 创建用于定义徽章及其标准的元架构。在数据库中存储一些信息并让代码查询它以找出徽章及其标准。

有更好的方法吗?

【问题讨论】:

    标签: architecture badge


    【解决方案1】:

    规则。

    您在系统中创建事件,并在事件流处理器中使用规则。

    具体来说,假设您有一个“发了 10 个帖子”的徽章。您不会为每个帖子运行“从 user = :user 的帖子中选择计数(*)”。相反,您有一个简单的规则来监视每个帖子,并“计算它们”,将规则状态存储在用户配置文件中。

    这样“发 10 个帖子”和“发 1,000,000 个”帖子一样便宜。

    这也使系统更具可扩展性。

    【讨论】:

    • 如果您走这条路,请注意添加新徽章并需要分析现有用户应该已经获得的情况。
    • 是的,这绝对是系统的一个缺点,但它仍然更加灵活和可扩展,因为(通常)添加新徽章远远少于测试和授予它们。
    • 那么您将如何处理添加徽章的问题?假设我有一个新徽章,例如 SO 添加的“woot”徽章。您将如何使其具有追溯力?
    • 您需要有一些机制来重新运行事件历史数据,以积累新徽章所需的统计数据并使其保持最新状态。
    • 回填徽章是这种方法的一个主要缺陷。基本上答案是你必须编写一个包含规则逻辑/标准的 cron 作业(可能是纯 SQL) - 那么为什么不直接编写 cron 开始并跳过(诚然更高级的)事件流处理器?
    【解决方案2】:

    我同意威尔的观点。

    在页面上创建“事件”,以便每次发生事件时,即。用户删除帖子,它将使用事件查询事件模块,比如说,EVENT_USER_DELETE_POST,然后您可以选择该事件并基于它构建查询。然后,您可以决定是否授予徽章。

    这将使两个逻辑保持分离并保持模块化设计。这种方式应该很容易实现。

    唯一的缺点是,如果事件没有被“捕获”,那么用户很可能已经获得了徽章标准,但尚未获得奖励。但是,这绝不应该发生。我能想到的唯一情况是手动操作数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2012-04-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多