【发布时间】:2016-10-27 01:23:00
【问题描述】:
我有一个看起来像这样的 FireBase 结构。我想代表世界上所有国家。
在这个示例代码中只有 9 个国家,只有美国和委内瑞拉有数据来证明我的问题。
我进行了非规范化并尽可能地展平数据。
她发生的事情是用户可以搜索街道地址,例如
US/California/Orange County/Orange/3138 E Maple Ave
在下面的数据库中,它看起来像这样:
US/ADMINISTRATIVE_AREA_LEVEL_1/
US/ADMINISTRATIVE_AREA_LEVEL_2
US/LOCALITY
US/STREET_ADDRESS
....
....
"AE": {
"name": "United Arab Emirates"
},
"GB": {
"name": "United Kingdom"
},
"US": {
"name": "United States"
"ADMINISTRATIVE_AREA_LEVEL_1": {
"hjg86tghg8hubyhiuhb88ihi": {
"level1": "California"
},
},
"ADMINISTRATIVE_AREA_LEVEL_2": {
"hjg86tghg8hubyhiuhb88ihi": {
"level2": "Orange County"
},
},
"LOCALITY": {
"hjg86tghg8hubyhiuhb88ihi": {
"level2": "Orange"
},
},
"STREET_ADDRESS": {
"hjg86tghg8hubyhiuhb88ihi": {
"3138 E Maple Ave": {
}
}
},
"USER_LIST": {
"hjg86tghg8hubyhiuhb88ihi": {
"name": "Jhon Doe",
}
},
"CHAT_LIST": {
"hjg86tghg8hubyhiuhb88ihi": {
"title": "Wam-Bam-CHAT",
}
},
"chat_members": {
"hjg86tghg8hubyhiuhb88ihi": {
}
},
"chat_messages": {
"hjg86tghg8hubyhiuhb88ihi": {
},
},
"UM": {
"name": "United States Minor Outlying Islands"
},
"UY": {
"name": "Uruguay"
},
"UZ": {
"name": "Uzbekistan"
},
"VU": {
"name": "Vanuate"
},
"VE": {
"name": "Venezuela"
"ADMINISTRATIVE_AREA_LEVEL_1": {
"swdkewsjdr34378943489324": {
"level1": "California"
},
},
"ADMINISTRATIVE_AREA_LEVEL_2": {
"swdkewsjdr34378943489324": {
"level2": "Orange County"
},
},
"LOCALITY": {
"swdkewsjdr34378943489324": {
"level2": "Orange"
},
},
"STREET_ADDRESS": {
"swdkewsjdr34378943489324": {
"3138 E Maple Ave": {
}
}
},
"USER_LIST": {
"swdkewsjdr34378943489324": {
"name": "Jhon Doe",
}
},
"CHAT_LIST": {
"swdkewsjdr34378943489324": {
"title": "Wam-Bam-CHAT",
}
},
"chat_members": {
"swdkewsjdr34378943489324": {
}
},
"chat_messages": {
"swdkewsjdr34378943489324": {
},
},
"VN": {
"name": "Viet Nam"
....
....
当我创建这样的实时数据库规则时:我必须创建 240 个根节点,因为 240 个国家/地区对。
有一大堆".read": "$uid === auth.uid" 和一大堆重复的json,因为所有ADMINISTRATIVE_AREA_LEVEL_1 和其他看起来都一样。
如果我将ADMINISTRATIVE_AREA_LEVEL_1 作为根,我可能会有数百万个条目,而对于 STREET_ADDRESS,仅美国就有 1.54 亿,更不用说“世界”了。所以我像这样对它们进行分组,将 Country 作为关键根节点。
小样本:
{
"rules": {
"SE": {
"ADMINISTRATIVE_AREA_LEVEL_1": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
},
"VE": {
"ADMINISTRATIVE_AREA_LEVEL_1": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
}
我的问题是如何进一步提高效率以及我可以期待哪些瓶颈。有没有办法拥有这种结构并集中设置规则而无需在所有位置显式编写它
更新 可能我弄错了,但无论如何,在@FrankvanPuffelen 回答之后,我尝试了这个:必须测试运行这个,但是这在我上面的代码中的所有 240 个国家/地区都有效..
{
"rules": {
"$country": {
"ADMINISTRATIVE_AREA_LEVEL_1": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"ADMINISTRATIVE_AREA_LEVEL_2": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"LOCALITY": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
....and more
}
}
}
更新 是的,它只需要一点时间就可以工作
{
"rules": {
"$hubaBuba": {
"ADMINISTRATIVE_AREA_LEVEL_1": {
".read": "auth != null",
".write": "auth != null",
},
"ADMINISTRATIVE_AREA_LEVEL_2": {
".read": "auth != null",
".write": "auth != null",
},
"LOCALITY": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
....and more
}
}
【问题讨论】:
标签: firebase-realtime-database firebase-security