【问题标题】:Firebase database structure - denormalized data?Firebase 数据库结构 - 非规范化数据?
【发布时间】:2017-07-20 15:13:40
【问题描述】:

我最近阅读了很多关于 nosql 数据库的内容。我得到的经验法则是根据我们的观点来构造数据(当然,取决于用例)。

现在,假设我们有一个社交应用,用户有个人资料,但他也创建了帖子,我们必须将它们存储在数据库中。

所以,我看到一些开发人员选择这样做:

Posts
-----UserID
-----------PostID
-----------------username: John
-----------------profileImage: https://...
-----------------posted_photo: https://...

这完全符合基于视图的结构。我们会进入帖子和我们的用户 ID,我们可以获得视图需要的所有数据。现在我的问题是,当用户发布了 100K 帖子并且他决定更改他的个人资料照片时会发生什么。到目前为止,他的所有帖子都包含他的旧照片,所以现在,我们必须编写一个方法来循环遍历 100K 帖子(或他的所有帖子)并更新他的照片。在 2 小时内,他决定“不,我不喜欢这张照片,我会把它改回来”,我们必须再进行 10 万次查询。

那(非规范化数据)好吗?当然,它更容易,它是平坦的,但是我们必须进行大量的查询才能更改一张个人资料照片。真正的处理方法是什么?

【问题讨论】:

    标签: firebase firebase-realtime-database nosql


    【解决方案1】:

    我已经将用户的数据存储在一个地方,并将用户 ID 设置为 post 属性。

    posts:
        userID:
            postID:
                userID: 'user1',
                attachedImageURL: 'http:..',
                message: 'hey',
                reblogID: 'post4',
                type: 'audio|poll|quote'
    users:
        user1:
            name: 'john',
            profileImage: 'http..'
    

    需要对 Firebase 再进行一次查询才能检索用户的个人资料数据,但这是解决此问题的好方法。这实际上取决于您希望如何使用这些数据。

    【讨论】:

    • 这正是我想这样做的方式。好的,不过我有一个问题要问你。如果您有超过一种类型的帖子,您将如何存储它?例如,您可以发布图片帖子、视频帖子、文字帖子、投票帖子等。所有这些都可以有 cmet、喜欢、转发。
    • 您可以将数据存储在帖子中 :) 我已经更新了答案
    • 你误读了 :) 我主要担心的是我有 9 种不同类型的帖子(视频、图像、普通文本、投票、报价等),我不知道如何构建这样它就不会太嵌套......就像帖子 - > AudioPosts - > UserID - > PostID(......帖子信息......)
    • 您可以在帖子中设置属性type,然后使用orderByChild('type') 只获取您想要的类型:) 我已经更新了我的答案
    • 但这不是问题吗?例如,如果您只想显示音频帖子,这将下载所有帖子(无论类型如何)并仅针对音频帖子过滤它们?
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多