Firebase Firestore中的最佳数据结构设计介于两者之间?

Firebase Firestore中的最佳数据结构设计介于两者之间?,firebase,google-cloud-firestore,nosql,Firebase,Google Cloud Firestore,Nosql,我对如何构建firestore数据有疑问 每天,我都有如下信息: TodayDate, From, ToUser1, Subject, Attachment2, AttachmentTypeB TodayDate, From, ToUser1, Subject, Attachment3, AttachmentTypeA TodayDate, From, ToUser2, Subject, Attachment4, AttachmentTypeA TodayDate, From, ToUser2,

我对如何构建firestore数据有疑问

每天,我都有如下信息:

TodayDate, From, ToUser1, Subject, Attachment2, AttachmentTypeB
TodayDate, From, ToUser1, Subject, Attachment3, AttachmentTypeA
TodayDate, From, ToUser2, Subject, Attachment4, AttachmentTypeA
TodayDate, From, ToUser2, Subject, Attachment5, AttachmentTypeC

主题和来源从来都不一样

我在两个结构之间犹豫,但我打开来考虑其他的结构设计。

0/ Root / doc / sub col / sub col fields

1/ users / userid / date / from,subject,etc
OR
2/ reports / date / userid / from,subject,etc 
我相信解决方案2从长远来看将更节省成本,因为对于一个查询,我每个日期的记录将多于每个用户的记录。对于更新,它是类似的

请问你有什么建议

亲切问候,


Julie

考虑到您当前的数据结构,我建议您只使用cloud firestore而不是实时数据库,因为这样可以更好地扩展,并且可以以非常低的成本获得相当好的性能

您可以启动一个集合,每个记录都包含列出的属性:
TodayDate、From、ToUser2、Subject、Attachment5、AttachmentTypeC
。使用where可轻松查询:

firestore().collection(“myCollection”).where(“subject”,“subject==”,subject.get()
看这个

更新:关于你的两个选项,我不认为这取决于哪个选项获取/更新更多/更少的记录。这取决于应用程序的要求/实际使用情况。您可能需要获取特定用户的记录,而不仅仅是特定日期的记录,反之亦然。因此,这两种结构在成本方面并没有什么区别,除非您确定永远不需要为每个用户获取记录


因此,我认为主要的关注点应该是你的结构有多直观和灵活,以及随着时间的推移它有多容易维护。首先,您应该考虑不要使用子集合,如从您的日常记录数据中看到的那样,您可以实现您所需要的,并获得具有更灵活结构的简单集合,其中包含具有必要属性的文档。我认为,当您不希望总是获取某个记录的所有属性,或者需要特定属性而不是整个记录的实时侦听器时,通常需要子集合。子集合实际上不会增加/减少获取的记录数量,这取决于实际使用情况

这两个选项看起来都像大型JSON树,表明您正在考虑使用实时数据库,而不是firestore。我是否理解TodayDate、From等都是您数据中典型记录上的属性?是的,您理解正确。我可以用Firebase DB吗?就成本而言,它更有意义吗?谢谢,我已经快要选择firestore了,只是我不知道如何设计它。我在1/users(作为col)/userid(作为doc)/date(作为subcol)/from、subject等或2/reports(col)/date(doc)/userid(subcol)/from、subject等之间犹豫。谢谢回答!最后想一想,这些记录是通过用户或日期组织的,我不知道如何摆脱子集合级别。这些记录基本上类似于电子邮件收件箱中的记录,我需要能够按日期和用户区分这些记录。您收藏的每个文档都可以具有
date
userid
属性。提取时,使用
where()
子句来区分。比如
firestore().collection(“myCollection”).where(“userid”,“userid=”,userid).get()
。您还可以链接where子句以创建更复杂的查询。看见