【问题标题】:Clarification On Firebase Denormalization Blog Post澄清 Firebase 非规范化博客文章
【发布时间】:2014-02-19 06:27:55
【问题描述】:

我刚刚阅读了标题为 Denormalizing Your Data Is Normal 的 Firebase 博客文章,我要求澄清一下。

在注意事项段落之前,我一直在使用它。具体如下:

“修改 cmets 很简单:只需将 /cmets 下的注释值设置为新内容即可。要删除,只需从 /cmets 中删除该注释即可 — 每当您在代码中的其他地方遇到不符合要求的注释 ID 时'在/cmets中不存在,你可以假设它已被删除并正常进行"

对于修改,为什么我不必修改存储在/links和/users下的重复的cmet?

对于删除,我的理解是否正确,一旦我删除评论,我的所有阅读逻辑中都必须有逻辑以交叉检查 /cmets,以防它被删除?

谢谢!

【问题讨论】:

    标签: firebase denormalization


    【解决方案1】:

    博文中详述的结构不存储重复的 cmets。我们将 cmets 存储在 /comments 下一次,然后将这些 cmets 的 name 存储在 /links/users 下。这些函数用作指向实际评论数据的指针。

    考虑帖子中的示例结构...

    {
      users: {
        user1: {
          name: "Alice",
          comments: {
            comment1: true
          }
        },
      },
      comments: {
        comment1: {
          body: "This is awesome!",
          author: "user1"
        }
      }
    }
    

    请注意,实际的评论数据只存储一次。

    如果我们修改/comments/comment1,我们不需要更新任何其他内容,因为我们只存储了/links/users下评论的name,而不是实际的评论内容。

    如果我们要删除/comments/comment1,那将删除唯一存在的评论数据。但是,在/users/user1/comments 下,我们仍然有这些对comment1 的“悬空”引用。

    假设我们删除了/comments/comment1,当我们尝试加载Alice 的cmets 时,我们可以看到comment1 不再存在。然后我们的应用程序可以通过以下方式做出相应的反应:a) 删除引用或 b) 忽略引用并且不尝试显示已删除的评论。

    【讨论】:

    • 很抱歉错过了 .set(true) 位。现在完全有道理。非常感谢您为我澄清这一点!
    • 例如,如果我将“comment1”重命名为“comment2”该怎么办? (在我的例子中,用户名可以重命名)
    • 诀窍是使用不是用户名的唯一用户标识符。您可以使用 ref.push().name() 来获取类似 GUID 的字符串,您将使用它来代替“user1”,然后如果用户名发生更改,请更改该对象上的用户名字段而不是 GUID。
    • 我的另一个疑问是这个规模如何。比如说,我正在使用移动应用程序并使用对象来序列化用户、评论等。当我读取对象时,cmets 数组可能非常庞大。如果有数千个cmets,会全部取走吗?它不会造成混乱吗?
    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多