Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase Firestore中嵌套文档的替代方案-寻找最佳实践?_Firebase_Data Structures_Google Cloud Firestore - Fatal编程技术网

Firebase Firestore中嵌套文档的替代方案-寻找最佳实践?

Firebase Firestore中嵌套文档的替代方案-寻找最佳实践?,firebase,data-structures,google-cloud-firestore,Firebase,Data Structures,Google Cloud Firestore,我对基于Firestore的项目的结构有些担心,因为直接嵌套文档似乎不是一种选择 为了简单起见,假设我们有一个firestore数据库,其中包含有关足球比赛的数据。对于每场比赛,都有一个包含球员阵容的文档、一个包含比赛事件列表的文档、一个包含比赛统计信息的文档等 由于统计数据、事件和列表等信息会以不同的时间间隔更新,从不同的API调用导入,并在消费应用程序中的不同屏幕中使用,因此我认为将它们保存在单独的文档中是最明智的做法 我目前使用的结构如下: /app-data/match-lineup/m

我对基于Firestore的项目的结构有些担心,因为直接嵌套文档似乎不是一种选择

为了简单起见,假设我们有一个firestore数据库,其中包含有关足球比赛的数据。对于每场比赛,都有一个包含球员阵容的文档、一个包含比赛事件列表的文档、一个包含比赛统计信息的文档等

由于统计数据、事件和列表等信息会以不同的时间间隔更新,从不同的API调用导入,并在消费应用程序中的不同屏幕中使用,因此我认为将它们保存在单独的文档中是最明智的做法

我目前使用的结构如下:

/app-data/match-lineup/matches/123456
/app-data/match-events/matches/123456
/app-data/match-statistics/matches/123456
然后我这样说:

/app-data/match-lineup/matches/123456
/app-data/match-events/matches/123456
/app-data/match-statistics/matches/123456
db.collection(“应用程序数据”)
.doc(“匹配列表”)
.收集(“匹配项”)
.doc(id);
但随着我添加更多与匹配相关的不同文档,我开始担心当前结构是否是反模式的

我更喜欢这样的结构,我觉得它最优雅,与RESTURL类似

/matches/123456/lineup
但这不是一个选项,因为
123456
不能引用
列表
文档

解决方法可能类似于

/matches/123456/attributes/lineup
有这样的参考文献

db.collection(“匹配项”)
.doc(id);
.集合(“属性”)
.doc(“列表”)

这是最好的折衷方案,还是应该考虑其他选项?

在NoSQL数据库中建模数据时,从来没有一个最佳且独特的解决方案

IMHO,您的两种方法完全有效,因为每个集合中包含的数据将“在消费应用程序中的单独屏幕中使用”(即,没有理由将所有数据“集中”在一个文档中,如您所述)。就查询效率而言,这两种方法是相似的


但是您可以考虑另一个条件:(在撰写本文时)您不能跨集合查询。当您需要跨比赛进行查询时,您可能会遇到一个用例,例如阵容中特定球员的所有比赛或
eventType==“惩罚”
的所有比赛。在这种情况下,您应该使用方法1(即
/app data/match-lineup/matches/123456
),因为使用方法2不可能跨匹配进行此类查询。

在NoSQL数据库中建模数据时,从来没有一个最佳且唯一的解决方案

IMHO,您的两种方法完全有效,因为每个集合中包含的数据将“在消费应用程序中的单独屏幕中使用”(即,没有理由将所有数据“集中”在一个文档中,如您所述)。就查询效率而言,这两种方法是相似的


但是您可以考虑另一个条件:(在撰写本文时)您不能跨集合查询。当您需要跨比赛进行查询时,您可能会遇到一个用例,例如阵容中特定球员的所有比赛或
eventType==“惩罚”
的所有比赛。在这种情况下,您应该使用方法1(即
/app data/match-lineup/matches/123456
),因为使用方法2不可能跨匹配进行此类查询。

我认为将Firestore数据结构视为“优雅”与否不是一个好主意。路径也没有义务看起来像RESTAPI。首先要考虑的是该结构是否适合您想要的查询。你可以有一个“优雅”的结构,但完全没有满足你的应用程序的需求。首先考虑你的应用程序的需求,然后考虑适合这些需求的结构。我不认为认为Firestore数据结构是否“优雅”是个好主意。路径也没有义务看起来像RESTAPI。首先要考虑的是该结构是否适合您想要的查询。你可以有一个“优雅”的结构,但完全没有满足你的应用程序的需求。首先考虑你的应用程序的需求,然后考虑适合这些需求的结构。谢谢你的回复。我很高兴听到我走上了正确的道路。我正在生成的文档是从用户输入和API数据中聚合而来的,我不希望对这些文档进行任何查询,因为这些文档提供了应用程序中屏幕的内容。我会挑一个看起来最好的:)@EsbenvonBuchwald很高兴我能帮上忙!:-)。如果“您认为这是您问题的最佳解决方案”,请参阅,您可以选择和/或接受答案。谢谢!谢谢你的回复。我很高兴听到我走上了正确的道路。我正在生成的文档是从用户输入和API数据中聚合而来的,我不希望对这些文档进行任何查询,因为这些文档提供了应用程序中屏幕的内容。我会挑一个看起来最好的:)@EsbenvonBuchwald很高兴我能帮上忙!:-)。如果“您认为这是您问题的最佳解决方案”,请参阅,您可以选择和/或接受答案。谢谢!