【问题标题】:Any ideas to improve my badge system?有什么改进我的徽章系统的想法吗?
【发布时间】:2011-08-13 18:03:01
【问题描述】:

我正在做一个徽章系统,到目前为止,我有这个想法:

创建一个 UserMeta 表来存储将在标准中使用的数据。

UserMeta
===========================
user_id | posted_comment_count | flagged_comment_count | reputation | etc.

我想知道这是否是一个好主意,好像我需要添加一些元数据作为标准,我需要添加一个列,所以我想在 json 中使用序列化对象,或者例如。

另一个名为 Badge 的表:

badge_id | badge_name | badge_criteria

徽章标准是 json 或任何其他序列化格式,其中存储如下对象:

{
  'posted_comment_count': '>= 20',
  'flagged_comment_count': '=10',
}

还有一个将用户与徽章相关联的表(一个简单的关联表)

我正在使用 Doctrine2,我想使用 Event 来更新 UserMeta。

有什么意见、建议吗?

【问题讨论】:

  • 我的偏好是使用 EAV 模式来存储用户元详细信息,以便可扩展。并且有单独的徽章类作用于数据。
  • @JohnP,EAV 对序列化对象有什么好处,在这两种情况下都“违反”经典数据库设计规则,此外,EAV 会丢失数据库完整性,就像序列化对象一样对象,但使用起来要复杂得多(以编程方式包装 EAV 比反序列化对象更难)
  • 我的意思是它用于组织 UserMeta 表。特别是因为它允许您添加越来越多的标准。编写一个 eav 类来为用户获取相关数据应该是微不足道的。将数据存储为 json 是可以的。我的意思是您可以为每种类型的徽章创建一个类,该类实际上包含应用它的代码

标签: php database-design doctrine-orm badge


【解决方案1】:

我的游戏化数据库非常简单。我有一个“货币”表,它有一个字段,一个名称。我有一个“UserCurrency”表,其中包含用户的 ID、他们赚取的货币的 ID 以及他们赚了多少的整数。当然,我有一个 User 表。

就是这样。

我使用 Django,所以其中一些可能没有意义,但基本上我有一个事件侦听器来侦听数据库上的事件。当用户执行任何事情导致数据库命中时,事件侦听器会遍历一系列函数,每个函数都包含目标语言的简单标准,用于确定何时授予徽章。如果用户达到该标准,则授予徽章。 (“货币”可能是“帖子数”或“回复数”,甚至是“戳数”。不要将其误认为是货币价值;它只是 whatever 就是你要追踪的。

这是一种非常简单且完全可扩展的记账机制,用于记分,不会因为您正在跟踪的特定事物的详细信息而使您的数据库架构变得混乱。它完全独立于任何其他用户跟踪详细信息,例如个人资料。如果您想添加一种新货币,即您要跟踪、关联和奖励徽章的新货币,您可以将其名称添加到货币表中,一组关于如何奖励的规则,一组阈值规则用户会收到一些确认,然后由您决定如何向用户展示以及奖励的后果是什么。

此外,规则可以相互关联。 Stack Overflow 做得非常(非常!)好。例如,当您访问该网站时,触发的规则甚至不计算货币,而是计算“爱好者”徽章的访问天数。每次获得声望时,如果您的分数超过 200,代码只会将货币计数器“传奇”更新 1,当该货币达到 150 时,另一个触发器会奖励您的“传奇”徽章,依此类推。解耦和独立是游戏化设计中的强大工具。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2020-07-16
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多