Json 使用网站;url";作为firebase的关键
当我想使用URL(例如www.abc.com/1234)时,我得到一个错误:Json 使用网站;url";作为firebase的关键,json,firebase,firebase-realtime-database,database-schema,database,Json,Firebase,Firebase Realtime Database,Database Schema,Database,当我想使用URL(例如www.abc.com/1234)时,我得到一个错误: First argument must be a valid firebase URL and the path can't contain ".", "#", "$", "[", or "]". 看起来在无架构的数据库中,URL不能用作键?我有什么选择?我仍然需要使用URL作为键高效地搜索网站对象。我不想查询每件事并自己循环它们 这是我想要的设计 { "websites": [ { "www
First argument must be a valid firebase URL and the path can't contain ".", "#", "$", "[", or "]".
看起来在无架构的数据库中,URL不能用作键?我有什么选择?我仍然需要使用URL作为键高效地搜索网站对象。我不想查询每件事并自己循环它们
这是我想要的设计
{
"websites": [
{
"www.abc.com/1234": {
"visits": 100,
"likes": 20
}
},
{
"www.abc.com/8888": {
"visits": 300,
"likes": 30
}
},
{
"www.uber.com/jobs": {
"visits": 400,
"likes": 50
}
}
]
}
使用Firebase的推送ID作为密钥,并将网站URL存储为属性。例如:
{
"websites": {
"-KCm4eCdDOiOqYU30y_a": {
"url": "www.abc.com/1234",
"visits": 100,
"likes": 20
},
"-KCm3gJvnsvAi9qRMqv_": {
"url": "www.abc.com/8888",
"visits": 300,
"likes": 30
},
"-KCm3f4lB1nIZKDSeXFG": {
"url": "www.uber.com/jobs",
"visits": 400,
"likes": 50
}
}
}
然后,当您需要根据其url获取特定子项时,您可以使用
orderByChild('url').equalTo('www.uber.com/jobs')
例如 使用Firebase的推送ID作为密钥,并将网站URL存储为属性。例如:
{
"websites": {
"-KCm4eCdDOiOqYU30y_a": {
"url": "www.abc.com/1234",
"visits": 100,
"likes": 20
},
"-KCm3gJvnsvAi9qRMqv_": {
"url": "www.abc.com/8888",
"visits": 300,
"likes": 30
},
"-KCm3f4lB1nIZKDSeXFG": {
"url": "www.uber.com/jobs",
"visits": 400,
"likes": 50
}
}
}
然后,当您需要根据其url获取特定子项时,您可以使用
orderByChild('url').equalTo('www.uber.com/jobs')
例如 @Anid Monsur的解决方案很好,但它需要往返Firebase,一个orderByChild
查询,并且需要客户端在线
我提出了另一种解决方案,对URL进行散列并将散列存储为密钥:
{
"websites": {
"hash('www.abc.com/1234')": {
"url": "www.abc.com/1234",
"visits": 10,
"likes": 20
}
}
}
由您选择合适的哈希函数
此解决方案的主要好处是性能—获取给定URL的密钥不再需要往返Firebase(或orderByChild
查询),而只需要快速哈希:
const key = hash(url);
如果您需要在后续查询中使用URLid
s(例如多对多关系),则好处会更加明显
第二个好处是,应用程序可以在脱机时使用URL
id
s进行操作。@Anid Monsur提出的解决方案只有在您在线时才有效。@Anid Monsur的解决方案很好,但它需要往返Firebase,进行orderByChild
查询,并要求客户端在线
我提出了另一种解决方案,对URL进行散列并将散列存储为密钥:
{
"websites": {
"hash('www.abc.com/1234')": {
"url": "www.abc.com/1234",
"visits": 10,
"likes": 20
}
}
}
由您选择合适的哈希函数
此解决方案的主要好处是性能—获取给定URL的密钥不再需要往返Firebase(或orderByChild
查询),而只需要快速哈希:
const key = hash(url);
如果您需要在后续查询中使用URLid
s(例如多对多关系),则好处会更加明显
第二个好处是,应用程序可以在脱机时使用URL
id
s进行操作。@Anid Monsur提出的解决方案只有在您在线时才有效。此解决方案很好,但需要往返Firebase,进行orderByChild
查询,并要求客户端在线。下面我提出了一个避免这些问题的替代方案。这个解决方案很好,但它需要往返Firebase,一个orderByChild
查询,并且需要客户端在线。下面我提出了一个避免这些问题的替代方案。什么样的哈希函数适合于哈希URL?什么样的哈希函数适合于哈希URL?