【发布时间】:2017-09-17 20:00:49
【问题描述】:
场景:我有一个存储其位置(城市和国家/地区)的用户节点。我想找到居住在特定城市的所有用户。然后每个城市,我想过滤 roomType,最后按用户的分数对用户进行排序。
问题:城市和国家是 字符串 字段,因此遍历所有用户以首先匹配国家和城市将是非常耗费资源的 string_comparison 查询。
我可以做些什么来加快搜索速度?
一种可能的方法:将城市 + 国家/地区“location_pair”转换为数值(例如 int_val_location_pair)。然后对 int_val_location_pair 进行整数比较。这比对国家和城市进行两个字符串比较要快得多。当然,我必须将映射存储为单独的节点。
世界上没有那么多城市(大约 4,000,000),所以我可以轻松地使用一个 32 字节的整数来表示世界上所有的城市。另外,实际上,我将让最多 10,000 个不同城市的用户注册。
架构可以是这样的:
$Users:
name:
city:
country:
$int_val_location_pair:
score:
roomType:
$int_val_location_pair:
city:
country:
问题:这是一个好方法吗??
如果是,我有下一个问题:在注册时,当用户填写国家和城市时,我想为 int_val_location_pair 自动创建一个新值,只有在 location_pair(城市和国家) 在数据库中不存在。
在这种情况下如何确保没有重复的int_val_location_pair?假设有 10 个人同时在同一位置注册(数据库中不存在)。他们都查询数据库并确认 location_pair 不存在,因此最终为 int_val_location_pair 创建了一个新值,从而导致重复。我应该如何避免这种情况?
提前致谢。
【问题讨论】:
标签: firebase firebase-realtime-database database-schema nosql