代码之家  ›  专栏  ›  技术社区  ›  Jonathan Allen

存储用户ID列表的最佳方法

  •  4
  • Jonathan Allen  · 技术社区  · 6 年前

    我正在开发一个php/mysql评级系统。为了让用户能够评价用户必须登录。每个用户都有一个唯一的“uid”。网站上会有多个评级实例(在我的例子中,每个游戏都有一个),我需要一种有效的方法,将一个uid列表存储在一个mysql行(评级系统的每个实例的评级表中都有一个mysql行)中,以记录投票人。

    我在其他系统中看到,列表存储在一个序列化的PHP数组中。每次用户投票时,序列化数组必须被提取、未序列化、插入新的uid、重新序列化数组以及更新mysql行。每次加载页面时,必须再次取消列表的序列化,并检查查看查看页面的用户是否投票,以确保用户不会投票两次。

    这似乎有点低效和麻烦。MySQL有内置的列表功能来帮助这个过程更高效吗?还有什么更聪明的方法可以解决这个问题吗?

    我考虑了一种可能的选择,那就是忘记序列化,并将uid存储在MySQL数据库的文本类型字段中。我只需要在每个uid后面附加一些非数字字符(比如句点[.])。要添加用户条目,我只需将uid连接到文本字段的末尾,然后再连接一个句点。当检查用户是否已经投票时,我可以“从投票数为“%$uid.%';”的表中选择*”。这会更有效地工作还是有更优雅的方式来完成工作?

    关于表格结构的后续文章… Efficient MySQL table structure for rating system

    2 回复  |  直到 10 年前
        1
  •  17
  •   cletus    15 年前

    这是低效的。从关系的角度来看,这里的内容是用户和游戏之间的多对多关系。用户可以对许多游戏进行投票。一个游戏可以由许多用户投票决定。解决方法是有一个联接表:

    USERS (uid, name, ...)
    GAMES (gid, name, ...)
    VOTES (id, uid, gid, ...)
    

    其中uid和gid是返回各自表的外键。

    如果有人投票,请在投票中插入记录。

    要获得游戏的投票列表,请执行以下操作:

    $get = mysql_query("SELECT * FROM votes WHERE gid = $game_id");
    ...
    

    要获取用户投票列表,请执行以下操作:

    $get = mysql_query("SELECT * FROM votes WHERE uid = $user_id");
    ...
    

    等等。

    不要联接数组并将其存储在单列中。你避免那样做是对的。

        2
  •  4
  •   Mehrdad Afshari    15 年前

    在规范化数据库中,应将其存储在联接表中:

    UserRatings
    -------------
    RatingID int
    UserID int
    UserVote int
    

    我不知道你有什么问题。根据应用程序的不同,这可能没有可接受的性能。然而,在这两种情况下,我建议您使用规范化方法、基准和非规范化(仅在适当的情况下)。