Java 我使用的结构正确吗?
我正在开发一个使用Firebase作为数据库的应用程序 我一直在设计关系数据库(MySQL),我不确定我是否在设计我需要的数据库 就MySQL而言,我有3个相互关联的表。 第一个表名为“Login”,第二个表名为“Usuario”,第三个表名为“Fichada” 至于关系,“登录”与单个“Usuario”(1:1)关联,“登录”可以有多个“Fichada”(0:*) 我需要的是在非关系数据库的范例中设计相同的结构 现在我有了这样的东西:Java 我使用的结构正确吗?,java,firebase,google-cloud-firestore,Java,Firebase,Google Cloud Firestore,我正在开发一个使用Firebase作为数据库的应用程序 我一直在设计关系数据库(MySQL),我不确定我是否在设计我需要的数据库 就MySQL而言,我有3个相互关联的表。 第一个表名为“Login”,第二个表名为“Usuario”,第三个表名为“Fichada” 至于关系,“登录”与单个“Usuario”(1:1)关联,“登录”可以有多个“Fichada”(0:*) 我需要的是在非关系数据库的范例中设计相同的结构 现在我有了这样的东西: "Login": "atribute1" : v
"Login":
"atribute1" : value1
"atribute2" : value2
"Usuario": {
"atribute3" : value3
"atribute4" : value4
}
"Collection<Fichada>": {
"atribute5" : atribute5
}
“登录”:
“atribute1”:值1
“atribute2”:值2
“Usuario”:{
“atribute3”:值3
“atribute4”:值4
}
“收藏”:{
“atribute5”:atribute5
}
我有一个名为“Login”的文档,里面有另一个名为“Usuario”的文档和一个名为“Fichada”的文档集合
我需要的是知道这是否正确。我对此表示怀疑,因为当我进入应用程序时,用户必须输入他们的登录信息,那时我根本不需要“Fichada”中包含的信息。问题是,我不知道如何只获取我当时需要的信息(当我获取登录文档时,我会自动获取“Usuario”和所有“Fichada”文档)。
在一个据称拥有15.000.000“Fichada”的案件中,我不想把它们全部带来,但由于我从Firebase带来的是登录对象,而不是“Fichada”,因此,我无法过滤或稍后带来它们
我正在检索Firebase信息,如下所示:
Login login = new Login();
CollectionReference referenciaLogin = db.collection("login");
Query query = referenciaLogin.whereEqualTo("email", email);
List<QueryDocumentSnapshot> documentos = query.get().get().getDocuments();
login = documentos.get(0).toObject(Login.class);
login.setIdLogin(documentos.get(0).getId());
"UserIO":
"key": value_3
"value":{
"atribute3" : value3
"atribute4" : value4
}
Login Login=new Login();
CollectionReference ReferenceLogin=db.collection(“登录”);
Query Query=referencelogin.whereEqualTo(“电子邮件”,email);
List documentos=query.get().get().getDocuments();
login=documentos.get(0.toObject)(login.class);
login.setIdLogin(documentos.get(0.getId());
这样,每当我得到“Login”实体时,我也会得到所有的“Fichada”,我认为它不是最优的尽管上述结构确实是正确的,但如果您高度关注检索的效率,您可以使用更高级别的间接寻址,并将其设计为:
"Login":
"atribute1" : value1
"atribute2" : value2
"mapToUserIO" : value_3
"mapToFichada" : value_4
然后还有两个文件,如下所示:
Login login = new Login();
CollectionReference referenciaLogin = db.collection("login");
Query query = referenciaLogin.whereEqualTo("email", email);
List<QueryDocumentSnapshot> documentos = query.get().get().getDocuments();
login = documentos.get(0).toObject(Login.class);
login.setIdLogin(documentos.get(0).getId());
"UserIO":
"key": value_3
"value":{
"atribute3" : value3
"atribute4" : value4
}
也就是说,每个值都是一对
"Fichada":
"key": value_4
"value":"Collection<Fichada>": {
"atribute5" : atribute5
}
“菲查达”:
“键”:值_4
“值”:“集合”:{
“atribute5”:atribute5
}
也就是说,Fichada文档的值将是Fichada的集合
唯一的问题是维护映射的唯一键,但是您可以使用登录表的username/id/unique标识符作为两者的键。希望这能有所帮助:)对于nosql类型的数据库,实际上并没有“正确”的数据模型。满足所有预期查询的模型是正确的。为了实现这一点,您可能需要在大小和灵活性之间进行权衡,这是完全正常的。但是,我理解,我可以想到的提高效率的解决方案总是倾向于关系数据库模型。您知道是否有任何方法可以通过编程方式(使用Firebase提供的API或类似工具)获取部分文档,而不是完整文档?这是不可能的。从移动客户端读取文档的每个查询都会读取整个文档。太糟糕了,这是我的希望XD。谢谢你的信息!这个解决方案解决了我的效率“问题”,但它可能非常类似于一种关系。我的意思是,在MySQL中,我们保留一个ID来将一个实体与另一个实体关联起来。我认为非关系数据库的一个想法就是避免这种关系。如果我开始使用ID,就好像我在创建文档之间的关系,不是吗?是的,但是没有固定数据类型的约束,因此可以随时扩展UserIO/Fichada的文档,这是NoSQL数据库的最大优势之一。如果您真的不想拥有一个映射,那么提取文档的一部分将很困难,因为性能/灵活性的权衡总是存在的:)我明白了。我想我会使用这个解决方案,因为效率对我来说很重要,但这两个文档必须是相关的。谢谢你的回复:)