从实时数据库迁移到云Firestore需要对数据库进行全面重新设计。为此,我创建了一个包含一些主要设计决策的示例。 请参阅下面的电子表格中的图片和数据库设计。 我的两个问题是:
1 - 当我有一对多的关系时,它还可以选择将信息存储为文档中的数组吗?见数据库设计中的第8行。
2 - 我是否应仅包含引用,或复制一对多关系中的所有信息。参见数据库模型中的第38行。
https://docs.google.com/spreadsheets/d/13KtzSwR67-6TQ3V9X73HGsI2EQDG9FA8WMN9CCHKq48/edit?usp=sharing
答案 0 :(得分:3)
对于问题1,火库文档中有一个解决方案: https://cloud.google.com/firestore/docs/solutions/arrays
而不是使用数组,您使用值的映射并将它们设置为' true'它允许您查询它们,如下所示:
teachers: {
"teacherid1": true,
"teacherid2": true,
"teacherid3": true
}
对于问题2,您只需要保存教师ID,因为如果您有教师ID,您可以轻松查询相应的数据。
答案 1 :(得分:1)
通常:保持数据存储区尽可能浅,即避免子集合和嵌套。
数据可以一对一,一对多或多对多相关。 Firestore是automatically indexed实时数据存储。 Firestore通常被订阅,而不仅仅是一次查询/响应(系统的实时性质)。
关于Firestore数据模型,请始终考虑我将如何查询此数据存储?。仅在必须(且极有可能不需要)时,才(很少)使用子集合,数组和映射。使用自动ID与人类可读ID,例如使用000kztLDGafF4uKb8Cal
而不是banana
作为文档ID。
随着应用程序功能的增加,使用Cloud Functions for Firebase和/或Admin SDK的服务器端脚本成为管理(创建和建立索引)多对多数据关系的宝贵工具。例如,Firestore不支持全文搜索。这归结为在您的应用上实现强大的搜索功能的障碍。
最后,请尝试避免子集合,嵌套,数组和映射。遵循保持简单愚蠢(KISS)的原则。一旦您的应用程序扩大规模和/或需要更多功能,就可以利用服务器端脚本来保持应用程序的响应速度(快速),同时提供强大的功能。