0

我有一个关于像 Reddit 这样的书签网站如何管理用户记录的所有“投票”的问题。

例如,当我 (User_ID_292929) 在数据库中的某处逻辑上投票支持帖子 (Post_ID_282828) 时,它表示 User_ID_292929 投票支持 Post_ID_282828。

但是如何在数据库中对其进行结构化呢?处理用户配置文件的表格是否有一个充满逗号分隔值的字段,并且它会被分解并检查正在加载的页面上的帖子是否已被投票?

我不是在寻找一个冗长的答案,而是更多关于类似结构的示例程序或文档。

谢谢

4

5 回答 5

3

假设用户只能对特定帖子投票一次,那么您可以创建一个包含 2 列(user_idpost_id )的新表(我们称之为users_vote_posts)。将user_idpost_id都设置为复合主键。

使用您的示例,假设用户 (User_ID_292929) 对帖子 (Post_ID_282828) 进行投票。该表如下所示:



    +---------+---------+
    | user_id | post_id |
    +---------+---------+
    |  292929 |  282828 |
    +---------+---------+

如果有不止一种投票类型(例如,向上或向下投票),那么您可以添加另一个定义投票类型的列(我们称之为vote_type)。

现在表格看起来像这样:



    +---------+---------+-----------+
    | user_id | post_id | vote_type |
    +---------+---------+-----------+
    |  292929 |  282828 | up        |
    +---------+---------+-----------+

于 2011-12-14T08:41:28.743 回答
0

最简单的方法是有一个表格,其中一列跟踪投票的用户,另一列记录他们投票的事物的 id。如果 id 在所有类型中不是唯一的,您可能还会有第三列指定他们投票的事物类型。

于 2011-12-14T04:46:00.653 回答
0

这就是所谓的多值属性。发生这种情况时,您有一个单独的表来指定您需要的信息。所以,你可以有userid,postid。这将成为该表的主键,因为 userid 和 postid 一起将是唯一的,因此数据库中不会有重复或错误。如果您需要有关帖子的更多信息,您始终可以在查询中使用连接运算符来获取有关帖子或用户的更多信息。

此外,由于表更小,您可以缓存它以便更快地访问,像 reddit 这样的网站将广泛使用缓存和集群。

于 2011-12-14T04:51:49.417 回答
0

我为我正在制作的网站解决了这个问题。

像 Reddit 一样,用户可以登录并在主页上看到 20 多个故事。

加入针对 User 和 Story 表的 Vote 表并不能非常有效地确定当前登录的用户是否对每个故事进行了投票。

我采用了一种混合方法:1)制作一个“投票”表(id、userid、storyid) 2)将一个“Voted_Cache”列添加到“Story”表中,该表是已投票的用户 ID 的逗号分隔列表 (CSV)关于故事。

现在,当我在主页上加载 20 篇文章时,我可以检查当前 userid 是否存在于 story.Voted_Cache 列中,而不需要对 Vote 表进行 JOIN。

'Vote' 表是让我知道对哪些故事进行投票的权威,如有必要,可以从该表中重建 Voted_Cache 列。

于 2011-12-14T09:27:07.173 回答
0

此类问题的典型设计模式是为投票的用户创建关联表。关联表看起来很简单

assoc_user_vote - 表名

id - 主键

用户身份

投票人

assoc_user_vote 表中的每条记录都有一个唯一的 id - 可能自动递增或播种,并包含用户和投票 id。userid 和 voteid 是各自表中的主键。

此模式支持特定用户的许多投票,并遵循数据规范化最佳实践。http://en.wikipedia.org/wiki/Database_normalization

于 2011-12-14T16:51:03.173 回答