如何设计Cloud Firestore数据库架构

时间:2017-11-02 13:20:02

标签: firebase google-cloud-firestore

从实时数据库迁移到云Firestore需要对数据库进行全面重新设计。为此,我创建了一个包含一些主要设计决策的示例。 请参阅下面的电子表格中的图片和数据库设计。 我的两个问题是:

1 - 当我有一对多的关系时,它还可以选择将信息存储为文档中的数组吗?见数据库设计中的第8行。

2 - 我是否应仅包含引用,或复制一对多关系中的所有信息。参见数据库模型中的第38行。

enter image description here

https://docs.google.com/spreadsheets/d/13KtzSwR67-6TQ3V9X73HGsI2EQDG9FA8WMN9CCHKq48/edit?usp=sharing

2 个答案:

答案 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)的原则。一旦您的应用程序扩大规模和/或需要更多功能,就可以利用服务器端脚本来保持应用程序的响应速度(快速),同时提供强大的功能。