1

我目前在 React + Firebase 项目中工作。在 Firestore 中,我需要保存用户的数据,但目前我不知道使用哪种方法。将有两个用户,教师和学生。

第一个选项:设置用户集合,每个文档都有“用户类型”字段,用于定义用户是教师还是学生。我用这种方法看到的问题是,可以说:

  • 一位老师输入他的凭据并尝试登录。成功登录后,我的系统将转到firestore并搜索与老师相关的信息。所以基本上 in 将查询“用户”集合以根据电子邮件(电子邮件将是唯一的)和“用户类型”==“老师”来查找数据。在最坏的情况下,用户是一个非常大的集合,然后查询获取教师数据会影响用户体验,因为 firestore 需要读取大量文档。

第二个选项:创建两个集合,一个“教师”集合和一个“学生”集合。然后在我的系统中,我将设置两个登录按钮,而不是单个登录按钮,一个作为教师登录,一个作为学生登录。然后,对于相同的示例:

  • 一位老师输入他的凭据并尝试登录。成功登录后,我的系统将转到 firestore 并在“老师”集合中搜索信息,非常快速地检索我需要的数据。这里的问题是我需要构建两个按钮,而且我担心它会使我的 Web 应用程序对用户不太友好或不太直观。

希望我能很好地解释自己,我不是最好的英语作家,谷歌翻译并没有太大帮助。任何帮助将不胜感激。提前致谢。

4

1 回答 1

2

所以基本上会查询“用户”集合以查找基于电子邮件的数据(电子邮件将是唯一的)和“用户类型”==“老师”

那不是真的。如果电子邮件真的很独特,则不需要过滤user-type。你不需要使用where. 只需创建对与用户关联的文档的引用即可get()

const userDoc = await db.collection('users').doc(userEmail).get();

正如 Nicholas 所说,您应该考虑使用 UID 而不是电子邮件。

users 是一个非常大的集合,然后查询获取老师的数据会影响用户体验,因为 firestore 需要读取大量文档

这也不是真的。查询性能与结果集的大小成正比,而不是与数据集的大小成正比

关于尼古拉斯大厦的回答,

如果你有两个这样的 .where 子句,我认为你需要创建一个索引。代码应该抛出一个有 url 的异常;按照那个 url,它会让你创建索引(一旦创建,异常就不会再发生了)。

如果将等式 ( ==) 与范围 (>>=) 结合起来,则只需要索引。您可以在==没有索引的情况下组合任意数量。

于 2021-01-08T00:05:15.740 回答