你说:
如果有一个聪明的方法可以让我拥有一个 5 星评级系统,它会记住用户并可以在一张表中显示平均值以及信息。
您必须已经有一个用户表。“记住”为游戏投票的用户的唯一方法是通过对 userID 的 FK。现在,如果您有一张混合了用户和游戏的表格,那么您的表格将缺乏规范化并且具有以下形式:
+--------+----------------+------------------------+--------+------+
| GameId | GameName | GameDescription | User | Vote |
+--------+----------------+------------------------+--------+------+
| 1 | Counter Strike | An addicting FPS game! | Timmy | 3 |
| 1 | Counter Strike | An addicting FPS game! | Martin | 5 |
| 1 | Counter Strike | An addicting FPS game! | Moe | 2 |
| 2 | Halo | Other addicting game | Timmy | 2 |
| 2 | Halo | Other addicting game | Sonny | 2 |
+--------+----------------+------------------------+--------+------+
而且这不是很规范化...实际上,您将到处重复 GameDescription 和 GameName!在这种情况下,您的 PK 将是 GameId 和 User。你迟早会后悔的。所以,让我们不要那样做。去做这个:
游戏(PK:GameId)
+--------+----------------+------------------------+
| GameId | GameName | GameDescription |
+--------+----------------+------------------------+
| 1 | Counter Strike | An addicting FPS game! |
| 2 | Halo | Other addicting game |
+--------+----------------+------------------------+
用户(PK:用户)
+--------+
| User |
+--------+
| Timmy |
| Martin |
| Moe |
+--------+
投票(PK:GameId 和用户)
+--------+--------+------+
| GameId | User | Vote |
+--------+--------+------+
| 1 | Timmy | 3 |
| 1 | Martin | 5 |
| 1 | Moe | 2 |
| 2 | Timmy | 2 |
| 2 | Sonny | 2 |
+--------+--------+------+
注意:我假设用户名是 PK,您也可以使用整数 userId,但这更容易阅读。
我知道加入很糟糕,但它们对你的帮助比对你的伤害更大。
现在,如何改进平均计算?好吧,对于每场比赛,您可以有另一列,例如TotalVotes
将保留总票数,另一列SumVotes
将保留该游戏所有投票的总和。因此,当投票的总数增加一时,TotalVotes 列并且您将用户分配给游戏的开始数量添加到 SumVotes。
然后,为了显示平均值,只需执行两个值的除法(这比连接和扫描表来重新计算要快得多。
好吧,我希望这可以帮助或指导您找到更好的解决方案。祝你好运!