【问题标题】:Efficient way making "Like" function without duplication?使“喜欢”功能不重复的有效方法?
【发布时间】:2020-12-01 03:59:27
【问题描述】:

我正在制作“点赞”功能(facebook 或 instagram 之类的),但不确定什么是正确的做法。

我可以想到两种方法....(用户不能两次喜欢同一篇文章)

A. “用户”数据具有一组“文章”ID...

// simplified user schema MongoDB
const UserSchema ={
    id:ObjectID,
    username:String,
    likes:[{type:ObjectID,ref:"Article"}]
}

// simplified article schema
const AriticleSchema = {
     id:ObjectID,
     title:String,
     content:String,
     likes:Number,
}

B. “文章”数据具有一组“用户”ID...

// simplified user schema MongoDB
const UserSchema ={
    id:ObjectID,
    username:String,

}

// simplified article schema
const AriticleSchema = {
     id:ObjectID,
     title:String,
     content:String,
     likes:[{type:ObjectID,ref:"User"}],
}

我尝试了两种方法,当我只有很少的用户和很少的文章时,它们都运行良好。

但是如果我有数千个“用户”和数千个“文章”呢?我担心每次我请求“用户”数据或“文章”数据(一次说几个)时,我还必须带数千个数组?我认为必须有更好的方法来做到这一点......

您知道人们或公司是如何做到这一点的吗?我想知道“Like”功能的工作原理。

谢谢。

** 添加一些细节 **

我希望“用户”可以登录阅读文章,然后按“喜欢按钮”来点赞。每次唯一用户喜欢时,文章“喜欢”将增加 1(无重复)。已经喜欢“文章”的人可以“不喜欢”它或“用户”会看到他们已经喜欢了“文章”,这意味着我们必须知道“用户”是否喜欢这个“文章”。其他人不需要知道。

【问题讨论】:

  • 您设计数据架构的方式最终取决于您的访问模式。你想用这个模型在高层次上构建什么功能?
  • 与数据的其他用途相比,您似乎更希望显示“谁喜欢过特定文章”。这就是说您要确保优化特定查询。
  • 我希望“用户”可以登录阅读文章,然后按“喜欢按钮”来点赞。每次唯一用户喜欢时,文章“喜欢”将增加 1(无重复)。已经喜欢“文章”的人可以“取消”它或“用户”会看到他们已经喜欢了“文章”,这意味着我们必须知道“用户”是否喜欢这个“文章”......谢谢建议

标签: javascript node.js arrays database mongodb


【解决方案1】:

我将通过逐步完成您详细阐述的要求来推断解决方案。

用户可以登录

这需要一些系统进行授权。您也许可以使用另一个专门用于此类事情的 Mongo 表 - 至少它应该将一些授权令牌链接到用户 ID。

const AuthSchema = {
  user_id: ObjectID,
  auth_token: string,
}

您获得此身份验证令牌的方式是通过各种方式 - 实际上取决于您如何对您的用户进行身份验证,例如电话身份验证或用户名/密码。所有这些都超出了这个答案的范围。

每次唯一用户喜欢时,文章“喜欢”就会增加 1(不重复)。已经喜欢“文章”的人可以“取消喜欢”它,否则“用户”会看到他们已经喜欢了“文章”

Redis Set 可以很好地建模。每次用户喜欢一篇文章时,将他们的 user_id 添加到该文章的 Redis 集中。此类集合的密钥可能如下所示:

article:${article_id}:likes

通过获取文章集合的大小(充满唯一的 user_id)来获取喜欢文章的人数。每当有人不喜欢某篇文章时,将其 user_id 从集合中移除。

进一步阅读:

【讨论】:

  • 谢谢!我从你的回答中得到了这个想法。很有帮助!
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多