关于数据库结构和许多功能的问题


A questions about database structures and lots of functions ala Reddit

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

例如,当我(User_ID_292929)在逻辑上投票给一个帖子(Post_ID_282828)时,它说User_ID_292929投票给了Post_ID_282828。

但是如何在DB中结构化呢?处理用户配置文件的表是否有一个全是逗号分隔值的字段,然后展开并检查正在加载的页面上的帖子是否已投票?

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

谢谢

假设用户只能投票一次特定的帖子,那么您可以创建一个包含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        |
    +---------+---------+-----------+

最简单的方法是使用一个表,其中一列用于跟踪投票的用户,另一列用于跟踪他们投票的内容的id。如果id在所有类型中不是唯一的,您还可以使用第三列指定他们投票的东西的类型。

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

另外,由于表较小,您可以缓存它以获得更快的访问速度,像reddit这样的网站将广泛使用缓存和集群。

我为我正在做的一个网站解决了这个问题。

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

连接一个投票表来反对User和Story表,对于找出当前登录的用户是否对每个故事投票并不是非常有效的。

我采用了混合方法:1)制作"投票"表(id, userid, storyid)2)添加一个'Voted_Cache'列到'Story'表,这是一个逗号分隔的列表(CSV)的用户id已经投票的故事。

现在,当我在主页上加载20篇文章时,我可以检查当前用户id是否存在于文章中。Voted_Cache列,而不需要对Vote表执行JOIN操作。

'Vote'表是权威的,它让我知道什么故事被投票了,如果必要的话,Voted_Cache列可以从这个表重建。

这类问题的典型设计模式是为投票的用户创建一个关联表。关联表可以像

这样简单。

assoc_user_vote -表名

id -主键

userid

voteid

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

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