匆匆的-问题:

总之,我有点困惑我是如何设计这样一个数据库,它允许无限期的徽章-规则的创作,而不需要进行结构改革的先前现有用户的表格中的数据库。

储存的徽章标题,标准,等等。什么表看起来像什么?

  • badge_id(1)
  • badge_title(10公里的徽章)
  • badge_image(10k.jpg)
  • badge_criteria([员额]>=10000)
    ...

嗦-问题:

我想实现的一个徽章-系统在我自己的个人项目,但是正在寻求一个建议,如何将最佳做这样的事情。我读过的一些问题有关的徽章-系统,但看不到数据库的结构越来越多的关注。

徽章是根据用户点(假设的"10公里的徽章"),似乎相当直截了当。任何事件,影响用户的信誉("顶",反对票持平,回答接受的,等等)将调用的方法来审查该用户的新的信誉,并可能奖徽章。

该系统听起来很直接的,但这是什么看起来像一个数据库管理员希望建立无数量的徽章很少努力下来的道路,其中一些可以根据不同的标准,而不是简单的用户的信誉。

用户的信誉可能是一个值内的用户记录本身。但是,理想的,你不会想要避免增加新的领域用户表在创建新的徽章?例如,"编辑100项"的徽章-你也不会创建一个新栏目"entries_edited"内的用户表格,你会吗?然后递增,之后每个条目编辑...

任何提示?

计算器的存档:


注:我不是要如何联系的徽章的用户。我不问怎样奖章(即将完成编程方式)

有帮助吗?

解决方案

鉴证准则可以随意复杂的,我不认为你可以储存在数据库表分解成"简单"的数据元。尝试写一个"引擎的规则",可以任意地处理复杂的标准是会带你走的道路基本上重新写作的所有工具,您有在您的程序语言。

如果你事先知道你想要徽章仅限于某些领域(即徽章是仅仅根据声誉或者数量的编辑内容或什么的),然后你可以储存在一个简单的表象:

ReputationBadgeCriteria
  BadgeId
  BadgeName
  MinReputation

或者您可以使用某种类型的DSL写你的"规则",但最终你必也创建一个分析程序分析的规则,当你读到他们,以及为执行这些规则。根据复杂,你想在你的DSL,这可能不是一个简单的任务。这看起来像路径你会在你的问题有一个标准栏(大概是纯文本),已经喜欢的东西"[声誉]>1000"或"[员额]>5"。你还是要分析和执行这些规则的复杂性和写什么东西这样做是依赖于如何复杂,你想要这些规则。

我会推荐你读 这些 日。 文章 对信息在为什么这种方法导致的痛苦。

其他提示

根据多远,你想去,你的架构可以获得相当复杂。在我看来,基本的元素,你需要跟踪的是:

Badges awarded
Points earned

很简单,迄今为止,但希望能够动态地创造新的徽章和新的分类。徽章的奖项将取决于收入点中的一个或更多一点的类别,将增加到一定的数量。所以你需要跟踪之间的关系点的类别(以及挣点)和徽章:

Point categories
Badge categories

所以关键就是你的用户点表,这将链接点的类别,其链接到徽章。用户赚点在一个特定的类别,这将有助于赚点对一个或多个徽章。

badges:
badge_id
badge_name
required_points
....

point_categories:
point_id
category_name
weighting (optional)
...

point_groups:
badge_id
point_id
weighting (optional)
...

user_points:
user_id
point_id
points
...

user_badges:
user_id
badge_id
points_earned
badge_awarded (yes/no)
...

你的"管理"接口将允许个人创造新的徽章和挑选,这一点类别需要赢得徽章(point_groups).每当的用户收入点(user_points),更新的user_points表,然后确定其徽章的那些点将可能有助于(point_groups).你再重新编译点为的徽章是受点获得和更新user_badges表与point_earned.然后检查points_earned领域中user_badges对required_points在徽章表。

你可以得到更好的分配不同的权重点不同的类别,或即使不同的权重点类别的特定徽章。但这种设置将允许不限数量的徽章和点的类别以创建和管理相当容易地不断变化表格的结构。

如果这是完全不你在找什么,那么我认为我应该至少获得投票或两个很大的打字。

你会跟踪你的独特的用户在一个表中的独特徽章在另一个然后创建一个交叉参考表,以及他们。

用户可以有许多的徽章和徽章可以有许多的用户。

create table users (
id int,
name varchar
)

create table badges (
id int,
badge_name varchar
)


create table user_badges_xref (
user_id int,
badge_id int
)

统计数字,可能会影响用户是否赢得徽章进行跟踪的一部分,管理局的网站。那东西就像一个答案被接受,将在一个架构,涉及的问题及答案。为了显示答案和业主的答复,将是一个关系到用户表和触发器会检查徽章的条件下,只要一个改变。

我不是询问如何奖徽章。我要如何储存的标准内的数据库。

所以你要储存的逻辑操作需要确定如果一个徽章赢得了在一个领域的地方吗?

我认为,同意与其他的海报,标准应该是一个业务部分的逻辑。这一逻辑可能会在应用程序方面或在一个触发器。我认为这是一个问题。

如果你真的结婚的想法储存的标准,在一个领域,我要保存它作为参数化SQL并运行它的动态。

因此,这类事会在你的标准领域:

select "Badge Earned"
from all_posts 
where user_id = @user_id
having count(*) > 10000

我不会创建一个增编辑的徽章。我想你应该有工作中运行的背景和count()该numbero后编辑为会员,没有警徽的编辑。当你看到该计数范围内你想要的,添加一个条目的数据库,告诉用户有徽章。

我认为这是关于相同于其他的徽章。尝试限制的数量书面方式,并不直接写计的徽章中的信息用户表。使用一个表格将包含徽章的信息和链接到用户表。

很抱歉,我正在简短。

实施一个系统如此,我可能创建一个表,其中储存或储存程序的名称或者实际查询,将用来确定特定用户是否已经获得了一个徽章。

badge_criteria
badge_key int
badge_criteria varchar(max)

你可以提取和执行的查询的徽章,其用户还没有获得自己的中间层,但是你不会做任何代码或结构的变化增添新的徽章。

我接近这样的:创建一个表以存储所有的徽章,并有一个列参考的功能,该功能运行以看到,如果徽章授予。这种方式表保持简单的逻辑确定的徽章可以保持在代码,它是最适合。

用这种方法,徽章的要求也可能是联在一起,以形成更复杂的依赖关系。例如,用户必须接收三个单独的、特定徽章w/在一定时间内为了得到这个徽章。

这将是下一步可能做到在数据库中的颁授勋章应该在你的商务逻辑的应用程序中。这样,你有所有的现有数据需要(编辑,访问、声誉,等等。) 它可以处理正如你看到的配合。

更新:

如果按标准你是说规则,确定是否以及如何徽章授予,则不应存储在数据库。这将几乎是不可能的测试和维护。

如果你的意思,例如,储存的"数量的编辑",有没有办法得到周围修改表或存储的过程包括数据如果您需要它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top