【问题标题】:Upvotes only visible to mutual friends database structure赞成票只对共同的朋友数据库结构可见
【发布时间】:2023-03-19 00:53:01
【问题描述】:

我正在 firebase 中构建一个简单的应用程序,用户可以在其中互相加为好友并为彼此的帖子点赞。但是,您只能看到共同好友的点赞。

即:如果 bob 喜欢 joe 的帖子。

如果我是 joe 和 bob 的朋友,我可以看到 bob 的点赞。

如果我只是和乔的朋友,我看不到鲍勃的喜欢。

我应该如何构建我的数据?我计划为每个用户创建 PostFeed:

— PostFeed (collection)
     — Uid (document)
         — Posts (collection)
              — Likes (collection)

如果我写了一篇新帖子,它会被添加到我所有朋友的帖子提要中。如果我有 1000 个朋友,该帖子将被添加到 1000 个供稿中。

我将每个帖子的赞存储在 PostFeed 中的每个帖子中。所以我们可以在没有额外查询的情况下获得喜欢。因此,如果 bob 喜欢 joes 的帖子,则喜欢的内容将添加到 joe 朋友的帖子供稿中的每个帖子中。

即:如果 joe 喜欢 bob 的帖子并且 bob 有 500 个朋友。鲍勃的帖子在 500 个朋友的 PostFeed。乔的赞应该添加到所有 500 个帖子中 每个 PostFeed。

但只有当我们是共同的朋友时,才会看到喜欢。

即:如果 bob 喜欢 joe 的帖子,它只会被添加到用户提要中,如果 我们是共同的朋友。因此,请查看 joe 的帖子,其中 bob 是 共同的朋友,并在这些帖子中点赞。

这是可扩展的吗?尽管大多数写入发生在 firebase 函数中,但写入操作似乎非常昂贵。特别是如果用户喜欢,则不喜欢,然后再次喜欢。或者,如果我添加了一位新朋友,我需要添加该新朋友在共同朋友的帖子上所做的所有点赞。

有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: mongodb firebase nosql amazon-dynamodb


    【解决方案1】:

    这不是一个好方法。

    例如,如果两个人在写完帖子后成为朋友,那么过去的帖子将不会出现在他们的提要中。此外,如果人们彼此解除好友关系,则所有的帖子都需要更新。

    相反,它应该只存储发生的实际信息,即:

    • 投票 ID(此记录的唯一 ID)
    • 帖子 ID(正在投票中)
    • 赞帖子的用户 ID

    所有“朋友”的东西都在此记录之上进行计算,无论是实时还是偶尔重新计算和缓存。

    您可能想研究使用图形数据库来存储所有这些关系而不是关系数据库

    见:TAO: The power of the graph | Facebook

    【讨论】:

    • 我使用的是一个 nosql 数据库的 firestore。如果两个人在写完帖子后成为朋友,则应将帖子复制到他们的每个提要中。这不是关系数据库,因此首选非规范化以使查询尽可能简单。我误解你的答案了吗?
    • 所以,如果某人有数百个帖子,突然成为其他人的朋友,您需要一个将这些帖子复制到每个提要的过程吗?如果人们有数百个朋友,那么数据将被复制数百次。虽然这对于检索而言可能看起来更有效,但它会破坏存储空间,并且每当人们交朋友/不交朋友时都会在“幕后”占用大量资源来更新此类记录。您应该创建一个模拟此类用户交互的测试平台,以确定此类架构是否具有可扩展性。
    • 是的,在 Firebase 中,将数据复制 10000 次到每个朋友提要是处理它的首选方式。它实际上并没有你想象的那么贵。见stackoverflow.com/questions/46979375/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2017-12-12
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多