我对像Reddit这样的书签网站如何管理用户记录的所有'投票'有疑问。
例如,当我(User_ID_292929)在某个数据库中的某个位置对某个帖子(Post_ID_282828)进行投票时,它说User_ID_292929已经投票了Post_ID_282828。
但是如何在数据库中进行结构化? handels用户配置文件的表是否有一个充满逗号分隔值的字段,它会被爆炸并检查以查看正在加载的页面上的帖子是否已被投票?
我不是在寻找一个很长的答案,而是更多关于类似结构的示例程序或文档。
由于
答案 0 :(得分:3)
假设用户只能对特定帖子投票一次,那么您可以创建一个包含2列的新表格(我们称之为 users_vote_posts )( user_id < / strong>和 post_id )。将 user_id 和 post_id 设置为复合主键。
使用您的示例,假设用户(User_ID_292929)对帖子进行了投票(Post_ID_282828)。该表如下所示:
+---------+---------+
| user_id | post_id |
+---------+---------+
| 292929 | 282828 |
+---------+---------+
如果有多种类型的投票(例如,向上或向下投票),那么您可以添加另一个定义投票类型的列(让我们称之为 vote_type )。
现在表格如下:
+---------+---------+-----------+
| user_id | post_id | vote_type |
+---------+---------+-----------+
| 292929 | 282828 | up |
+---------+---------+-----------+
答案 1 :(得分:0)
最简单的方法是让一个表有一列来跟踪投票的用户,另一列有他们投票的东西的id。如果id在所有类型中都不是唯一的,那么您可能还有第三列指定他们投票的内容类型。
答案 2 :(得分:0)
这就是所谓的多值属性。发生这种情况时,您有一个单独的表,指定您需要的信息。所以,你可以拥有userid,postid。这将成为该表的主键,因为userid和postid在一起将是唯一的,因此数据库中不会出现重复或错误。如果您需要有关帖子的更多信息,可以始终在查询中使用连接运算符来获取有关帖子或用户的更多信息。
此外,由于表格较小,您可以将其缓存以便更快地访问,像reddit这样的网站会广泛使用缓存并进行群集。
答案 3 :(得分:0)
我为我正在制作的网站解决了这个问题。
与Reddit一样,用户可以登录并在主页上看到20多个故事。
加入针对用户和故事表的投票表,找出当前登录的用户是否对每个故事投票都不会非常有效。
我采取了混合方法: 1)制作一个'投票'表(id,userid,storyid) 2)在“故事”表中添加“Voted_Cache”列,该表是以故事投票的用户ID的逗号分隔列表(CSV)。
现在当我在主页上加载20篇文章时,我可以查看当前用户标识是否存在于story.Voted_Cache列中,而不是需要对Vote表进行JOIN。
'投票'表是权威的,让我知道投票的故事,如有必要,可以从此表重建Voted_Cache列。
答案 4 :(得分:0)
此类问题的典型设计模式是为投票用户创建关联表。关联表可能看起来像
一样简单assoc_user_vote - 表名
id - 主键
<强>用户ID 强>
<强> voteid 强>
assoc_user_vote表中的每条记录都有一个唯一的ID - 可能是自动递增或播种,并包含用户和投票ID。 userid和voteid是各自表中的主键。
此模式支持特定用户的许多投票,并遵循数据规范化最佳实践。 http://en.wikipedia.org/wiki/Database_normalization