我只是来自关系数据库学校,对于新手来说,处理JSON数据库并不是一件容易的事。我有这种结构来存储用户:
{
"users" : {
"0CcKvNkOm5fVqL" : {
"birthday" : 564688000,
"country" : "US",
"email" : "[email protected]",
"firstName" : "John",
"gender" : "male",
"isOnline" : true,
"lastLoginDate" : 1468166460486,
"lastName" : "Paul",
"learningLanguages" : [ {
"language" : "fr_FR",
"levelID" : 2
} ],
"profileImage" : "https://firebasestorage.googleapis.com/image.jpg",
"providerID" : "Firebase",
"registrationDate" : 1468168460486,
"speakingLanguages" : [ {
"language" : "es_ES",
"levelID" : 7
} ]
}
}
}
我在我的应用程序中提供了一个搜索屏幕,用户可以在其中搜索其他用户,他们可以结合所有以下过滤器参数:
例子:
获取以下10
用户starting from index 0
:
male
"US"
speaks "da_DK"
与levelID 2
或/和 "fr_FR"
与any level
with
级别1并**and/or**
学习“ ar_AR”with
级别4`age range between 18 and 24
isOnline
和 last login date
。假设存在一个名为users_languages的表,这对于SQL来说是一项简单的任务:
SELECT ...
FROM users AS u
JOIN users_languages AS l
ON u.id = l.id
WHERE u.gender = "male"
AND u.age BETWEEN 18 AND 24 // need claculation but let's keep it simple
AND u.country = "US"
AND ((l.language = "de_DE" AND l.mode = "learning" AND l.level = 1) OR (l.language = "ar_AR" AND l.mode = "learning" AND l.level = 4))
....
ORDER BY isOnline, lastLoginDate DESC
LIMIT 0,10
我的问题:
最直接的答案是:您不能在Firebase中进行搜索。
让我提出一个文本墙的答案,希望能找到解决方案。
坦率地说:正如Frank在他的即时评论和链接中提到的那样,利用诸如ElasticSearch之类的其他产品可以是一种解决方案。尽管它们确实提供了可伸缩性,但它为方程式增加了另一个乘积。我建议进一步探索这些选择。
过滤很酷:第二种解决方案是过滤代码。尽管这对于成千上万的记录是一个很好的解决方案,但它无法扩展成千上万的记录。但是,如果您具有复杂的数据结构和有限的数据量,这是最佳的解决方案。
关于这一点,如果用户界面的结构使其可以正常工作,那么即使有数百万条记录,您也可以过滤代码。确定一到两个主要搜索,例如性别。然后对所有女性进行查询。这样可以将您的数据集减少一半,并且在代码中更易于管理。您还可以进一步减少数据集-请参阅下一节。
变化是件好事:另一个选择是构造数据以匹配将要执行的查询类型。举一个简单的例子:假设您要查询三个项目;性别国家年龄
您的Firebase结构为
users
-Jyiai09jsi
data: "male_US_40"
-Jqkjisjida
date: "male_US_27"
-JyHYjlkall
data: "male_US_30"
然后查询美国30至40岁之间的所有男性用户
usersRef.queryOrderedByChild("data").queryStartingAtValue("male_US_30")
.queryEndingAtValue("male_US_40").observeSingleEventOfType(
.Value, withBlock: { snapshot in
print(snapshot)
})
这里的好处是它具有可扩展性,但缺点是您不能仅查询美国用户。另一方面,这是一个非常小的数据集,您可以进一步在代码中进行过滤。
重复数据是您的朋友:好消息是,还有一个解决方案:磁盘空间便宜,因此重复数据
user_countries
US
-Jyiai09jsi: true
-Jqkjisjida: true
-JyHYjlkall: true
UK
etc etc
user_gender
male
-Jyiai09jsi: true
-Jqkjisjida: true
-JyHYjlkall: true
female
etc etc
user_speaks
da_UK
users
fr_FR
users
这种结构使您可以快速访问数据组。国家/地区,性别等。在这里,我使用true作为占位符,但从技术上讲,您也可以在该位置拥有每个用户节点。但是,这将再次在查询过程中读取大量数据。即使有成千上万个节点,一堆“真实”节点也只包含极少量的数据。
SQL ftw!还需要考虑的其他因素是您如何使用Firebase的异步特性。您是否真的需要将这些数据存储在Firebase中,还是可以将这些数据存储在另一个基于云的SQL Server中以进行查询并在Firebase中存储指向该数据的链接。这样,您可以通过SQL查询您的内心内容,然后使用Firebase进行消息传递,更新等。
最终思想如果要进行此类搜索,最好的选择是以一种结构化数据的方式,以尽可能快地减少其占用空间,然后在代码中过滤其余数据。想象一下,拥有一百万条记录,然后查询male_US_30_FR。现在您有几千条记录,可以轻松地加载它们并在代码中进一步过滤
我希望这些帮助中的一种或多种帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句