考虑一个用户可以为游戏评分的网站。可用的评级为:None,Liked或Disliked。代码将跟踪评级很好。目前的问题是用户可以对游戏进行评级并只是对其进行重新评级。
如果我想存储特定游戏的用户评级,SQL表格会如何?不应允许每个用户/游戏的重复评级。
答案 0 :(得分:3)
您可以使用以下表格:
user:
id
name
...
game:
id
name
...
user_rating:
user_id
game_id
rating
其中user_id
和game_id
指的是用户和游戏。它们都形成PRIMARY KEY
,因此模型不会多次支持用户评级。
rating
包含-1
,0
或+1
,可以将其相加以获得游戏的分数。
答案 1 :(得分:2)
CREATE TABLE ratings(
user_id int,
game_id int,
rating_value int
);
ALTER TABLE ratings ADD CONSTRAINT pk_ratings
PRIMARY KEY(user_id, game_id);
组合主键创建的唯一索引将保证在数据库级别上没有用户可以在同一游戏上投票两次。此外,您的应用程序可以轻松检查用户是否已经为特定游戏投票。
您可能还想在game_id
上创建索引,以便检查游戏评分的查询将能够使用索引。您可能希望在此索引中包含rating_value
字段,使其成为covering index,以获得更好的效果:
CREATE NONCLUSTERED INDEX ix_ratings
ON ratings(game_id, rating_value);