我正在实施一个网站,我的用户在完成某些目标或任务后会获得徽章。
徽章也有水平/颜色。例如,用户将从0级青铜徽章开始,随着他们的进步,他们将获得1级青铜徽章,并且在更多级别之后,他们将获得0级银徽章等等。
我正在构建数据库,我不确定如何将徽章连接到用户。
我提出的想法是为用户创建1个表,为徽章创建1个表,并将第3个UserID连接到BadgeID:
我关注的是优化。当更多用户加入网站并获得徽章时,访问表并搜索记录会变慢吗?
我读了 here 关于在Java中使用单例在服务器上定期运行脚本并根据规则检查用户状态以升级符合上限目标的标记。 这种方法真的可扩展吗?或者我应该遵循这个 Post 而不是?
TIA
答案 0 :(得分:5)
当更多用户加入网站并获得徽章时,访问该表并搜索记录会变慢吗?
如果你的表被正确编入索引,那么这并不重要。
想想这样......如果百科全书中的文章数量是这个百科全书的五倍,那么在百科全书中找到一篇文章需要花费更长的时间吗?
不是真的;因为百科全书按字母顺序编号,即使文章数量显着增加,也不需要花费太长时间才能找到。但是,如果它没有被编入索引,那么随着百科全书的大小增长,查找内容所需的时间会呈指数级增长。
鉴于你的问题以及你所关联的资源,我觉得你正专注于狭隘地使用“徽章”,这可能会让你错过更普遍的画面。
例如,如果徽章总是按顺序发出,你只需要记录某人得到的最后一张徽章;在这种情况下,他们必须得到所有徽章,直到最后一个徽章。如果它们不是增量的,那么使用您描述的链接表可能会更好。
尝试用与数据库或数据建模相关的术语来描述您的问题,而不是专门针对您的问题域的术语(“徽章”)。这应该可以帮助您找出您应该寻找的信息类型,并最终引导您采取正确的行动方案。
答案 1 :(得分:1)
现在,你可以像你描述的那样实现它(1个徽章表,1个用户表,1个关系表)。
GGG只存储最后一个徽章的方法是非常好的,只要用户只能有一个徽章并且徽章是按顺序发出的。但是,你不需要关系表。
使用关系表,您可以同时向用户(1:n关系)发出多个徽章,例如: Foursquare徽章。
如果你使用MySQL,你应该使用InnoDB。
如果遇到性能问题,可以考虑在存储前面使用某种缓存层,例如: memcached或仅使用NoSQL DB获取徽章信息。但是当你不得不面对这些问题时,我会担心这些问题。