Java Firebase Firestore体系结构:参考还是对象?

Java Firebase Firestore体系结构:参考还是对象?,java,android,firebase,nosql,google-cloud-firestore,Java,Android,Firebase,Nosql,Google Cloud Firestore,我正面临一个让我彻夜未眠的问题。。。这两种解决方案之间的最佳方式是什么?仅供参考,我正在构建一个示例聊天应用程序 解决方案1: public class Message { private String message; private Date dateCreated; private DocumentReference userSender; //Reference } 解决方案2: public class Message { private String

我正面临一个让我彻夜未眠的问题。。。这两种解决方案之间的最佳方式是什么?仅供参考,我正在构建一个示例聊天应用程序

解决方案1:

public class Message {
    private String message;
    private Date dateCreated;
    private DocumentReference userSender; //Reference
}
解决方案2:

public class Message {
    private String message;
    private Date dateCreated;
    private User userSender; //Plain Object
}
第一个非常类似SQL,允许我保留对发送消息的用户的引用。然而,通过一个巨大的消息列表(例如在一个RecyclerView中)访问每个用户的属性确实是一件痛苦的事

第二个更像JSON,但不可变:例如,如果用户更改其个人资料图片,以前发送的每条消息都将保留旧图片


有什么解决方案或想法吗?

与Firebase实时数据库不同,Cloud Firestore引入了
参考
,因此您可以利用它

请注意,没有最好的解决方案。你可以自由地使用你想要的任何东西,但有一件事要考虑,在你的应用程序中读/写数据的最简单方式是什么

在另一个类中使用一个类,这是Firestore的常见做法。在早期版本的数据库中,在Firebase Realtime数据库中,如果您在另一个类中嵌套了一个类(如您的示例中所示),则每次您都希望查询数据库以仅显示消息时,enitire
Message
对象将与
User
对象一起下载,结束花更多的钱在一起。但当涉及到收藏和文档时,情况就不一样了

关于第二种方法,您可以使用公共setter来更改对象中字段的值


使用Firestore,我可以说第二种解决方案非常适合我,因为您可以编写更清晰的代码,但这只是我的意见。

为了便于使用引用,解决方案是在一个
映射中构造引用

公共类消息{
私有字符串消息;
创建私人日期;
私人地图参考;
}

您可以创建一个泛型类或方法,该类或方法将在检索
消息时处理引用的解析

您可以使用
文档引用
而不是
对象
,然后使用:

DocumentSnapshot pro = Tasks.await(data.getUserSender().get());
User plainObject =  pro.toObject(User.class);
DocumentSnapshot pro = Tasks.await(data.getUserSender().get());
User plainObject =  pro.toObject(User.class);