Firebase有效地建模nXn关系

Firebase有效地建模nXn关系,firebase,google-cloud-firestore,modeling,Firebase,Google Cloud Firestore,Modeling,假设我有以下场景: 我有多个活动,多个用户可以参加。此外,用户还可以参加多个活动。存储所需信息并保持数据一致性的最佳方式是什么 以下是我的想法以及我不喜欢它们的原因: collection“events”->event document->subcollection“users”->user document 问题: 每个用户都存在于每个事件中,从而产生每个用户的多个文档。我不能只更新用户信息,因为我需要写入每个相关的事件文档并获取相关的用户文档。 如果试图使读/写尽可能少,那真是一场灾难 例如

假设我有以下场景:

我有多个活动,多个用户可以参加。此外,用户还可以参加多个活动。存储所需信息并保持数据一致性的最佳方式是什么

以下是我的想法以及我不喜欢它们的原因:

collection“events”->event document->subcollection“users”->user document
问题: 每个用户都存在于每个事件中,从而产生每个用户的多个文档。我不能只更新用户信息,因为我需要写入每个相关的事件文档并获取相关的用户文档。 如果试图使读/写尽可能少,那真是一场灾难 例如:

collection“users”->user document->subcollection“events”->event document
问题: 每个事件存在于每个用户上,导致每个事件的多个文档。(与第一个场景中的问题相同,正好相反)

集合“用户”和集合“事件”
,每个集合都将用户和事件作为文档从属于它们。 有一个数组
参与_events
,其中包含相关的事件id。 问题: 这是一种SQL排序方式。需要使用
forEach()
函数通过单独的查询获取每个文档。 例如

我缺少的是什么,是否有更好的方法来建模所需的体系结构

使用
集合“事件”->事件文档->子集合“用户”->用户文档时

这并不像你想象的那么糟糕。这种做法被称为非规范化,是Firebase的常见做法。如果您是NoSQL数据库的新手,为了更好地理解,我建议您观看此视频。它适用于Firebase实时数据库,但同样的规则适用于Cloud Firestore

我希望能够更改用户信息或事件信息,而无需获取数百个文档

如果你认为用户细节会经常发生变化,那么你应该考虑在每个<代码>用户< /COD>对象下存储一个事件ID的“代码>数组/<代码>和<强>不<强>使用子集合。同样,还应在每个

事件
对象下添加UID的
数组。您的新架构应如下所示:

Firestore-root
   |
   --- users (collection)
   |    |
   |    --- uid (document)
   |         |
   |         --- events: ["evenIdOne", "evenIdTwo", "evenIdThere"]
   |         |
   |         --- //Other user properties
   |
   --- events (collection)
        |
        --- eventId (document)
             |
             --- users: ["uidOne", "euidTwo", "uidThere"]
             |
             --- //Other event properties
由于您只保存引用,因此当更改用户名时,不需要在
事件
子集合中存在的所有用户对象中更新它。但请记住,在这种方法中,要获取(例如)用户分开的所有事件,您应该创建两个查询,一个是从用户文档获取事件ID,另一个是基于这些事件ID获取事件文档

基本上,这是使用非规范化和在数组中存储数据之间的一种折衷

存储所需信息并保持数据一致性的最佳方式是什么

通常,我们根据要执行的查询创建数据库模式。有关更多信息,我还建议从以下帖子中查看我的答案:


请编辑您的问题并添加您要执行的查询。请查看更新后的问题。因此,您希望获取用户正在参与的所有事件以及特定事件中的所有用户,对吗?否,我希望能够更改用户信息或事件信息,而无需获取数百个文档。
this.afs.collection('events').doc(eventId).get().then(res => {
    res.users.forEach(elem => {
        this.afs.collection('users').doc(elem.name).get()
        //Change name accordingly
    })
})
Firestore-root
   |
   --- users (collection)
   |    |
   |    --- uid (document)
   |         |
   |         --- events: ["evenIdOne", "evenIdTwo", "evenIdThere"]
   |         |
   |         --- //Other user properties
   |
   --- events (collection)
        |
        --- eventId (document)
             |
             --- users: ["uidOne", "euidTwo", "uidThere"]
             |
             --- //Other event properties