【问题标题】:Firebase Database: How to save a list of friends per user?Firebase 数据库:如何保存每个用户的朋友列表?
【发布时间】:2016-08-04 03:38:41
【问题描述】:

每个用户都有一个具有相同键的项目列表,例如朋友。 我知道这个例子是错误的,因为每个键都应该是唯一的。 如何以 JSON 格式做到这一点?

 {
  "users" : {
    "jmEcUjPaXVXHdsaddasdFrh1" : {
      "Name" : "John",
      "friends" : {
        "Name" : "Peter",
        "Name" : "Bob",
        "Name" : "Lisa"
      }
    }
  }
}

我试过了,但我不确定这是否是一个好的解决方案

{
  "users" : {
    "jmEcUjPaXVXHdsaddasdFrh1" : {
      "Name" : "John",
      "friends" : {
        "Peter" : "true",
        "Bob" : "true",
        "Lisa" : "true"
      }
    }
  }
}


#askFirebase

【问题讨论】:

  • 您在问题中包含了一张 JSON 的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • @FrankvanPuffelen 欢迎您 ;)

标签: json firebase firebase-realtime-database


【解决方案1】:

您正在寻找的是存储朋友的数组。

{
  "users": {
    "jmEcU..." : {
      "Name" : "John",
      "friends" : [
        "Peter",
        "Bob",
        "Lisa"
      ]
    }
  }
}

但是,使用包含分布式数据的数组存在一些并发问题。我建议您认真阅读 this post 以了解将数组与 Firebase 数据库一起使用的含义。

如果在通过this section of the post 之后,您确定不能使用数组,这里有一些关于新结构的建议

结构1:使用朋友的名字作为key。您可以使用任何值作为值,只要它不是null。您可以遍历friends 的所有孩子并获取密钥。

专业人士: 非常快速地确定一个用户是否与另一个用户成为朋友 - /users/{id}/friends/{name} exists

缺点:每个朋友的名字都必须是唯一的

{
  "users": {
    "jmEcU..." : {
      "Name" : "John",
      "friends" : {
        "Peter" : true,
        "Bob" : true,
        "Lisa" : true
      }
    }
  }
}

结构 2:使用 Firebase 的 Push 创建唯一 id 并用作键,以朋友的名字作为值。您可以遍历friends 的所有子节点并获取值。

专业人士:朋友的名字不必是唯一的

{
  "users": {
    "jmEcU..." : {
      "Name" : "John",
      "friends" : {
        "-JGnfnf..." : "Peter",
        "-JGnfoi.." : "Bob",
        "-JGnfuy.." : "Lisa"
      }
    }
  }
}

如果您需要朋友的不仅仅是名字,我建议存储朋友的用户 ID,而不是代表朋友详细信息的对象。如果您的用户 ID 是唯一的,这应该可以解决结构 1 的缺点,并使其在两个选项中更好。

【讨论】:

    【解决方案2】:

    试试这个结构:

      "users" : {
        "{user_1}" : {
          "email" : "geek@live.com",
          "firstName" : "Geek",
          "friends" : {
            "{user_2}" : {
              "status" : "pending",
              "with" : {
                 "firstName" : "Anna", 
                "profileImage" : "http://..."
              }
            }
          }
        } ,
        "{user_2}" : {
          "email" : "anna@live.com",
          "firstName" : "Anna",
          "friends" : {
            "{user_1}" : {
              "status" : "pending",
              "with" : {
                 "firstName" : "Geek",
                 "profileImage" : "https:..."
              }
            }
          }
        }
      }
    

    【讨论】:

    • 这不是要走的路,它看起来不错,但是当您想要显示电子邮件和用户的名字等信息时,您也会带来所有朋友的信息。最好只与用户节点之外的朋友创建另一个节点。
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多