Firebase数据库:如何保存每个用户的好友列表?

时间:2016-08-03 18:54:04

标签: json firebase firebase-realtime-database

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

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

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

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


#askFirebase

2 个答案:

答案 0 :(得分:4)

您正在寻找的是存储一群朋友。

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

但是,使用具有分布式数据的数组存在一些并发问题。我建议你真的阅读this post以了解在Firebase数据库中使用数组的含义。

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

结构1:使用朋友的名字作为关键。您可以使用任何内容作为值,只要它不是null即可。您可以循环遍历friends的所有子项并获取密钥。

专业版:非常快速地了解用户是否是其他用户的朋友 - /users/{id}/friends/{name} exists

Con:每个朋友的名字必须是唯一的

{
  "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的结果,并使它更好地用于两个选项。

答案 1 :(得分:1)

试试这个结构:

  "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:..."
          }
        }
      }
    }
  }