我正在开发一个使用 Firebase 作为数据库的应用程序。
我一直在设计关系数据库(MySQL),但我不确定我是否正在设计我需要的数据库
就MySQL而言,我有3个相互关联的表。 第一个表称为“Login”,第二个表称为“Usuario”,第三个表称为“Fichada”
就关系而言,一个“Login”可以关联一个“Usuario”(1:1),一个“Login”可以关联多个“Fichada”(0:*)
我需要的是设计相同的结构,但采用非关系数据库的范例。
现在我有类似的东西:
"Login":
"atribute1" : value1
"atribute2" : value2
"Usuario": {
"atribute3" : value3
"atribute4" : value4
}
"Collection<Fichada>": {
"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());
这样,每当我获得“Login”实体时,我也会获得所有“Fichada”,我认为这不是最佳的
最佳答案
虽然上面的结构确实是正确的,但如果您非常关心检索的效率,您可以使用多一层间接并设计如下:
"Login":
"atribute1" : value1
"atribute2" : value2
"mapToUserIO" : value_3
"mapToFichada" : value_4
然后还有两个文档如下:
"UserIO":
"key": value_3
"value":{
"atribute3" : value3
"atribute4" : value4
}
也就是说,每个值都是一对。
"Fichada":
"key": value_4
"value":"Collection<Fichada>": {
"atribute5" : atribute5
}
也就是说,Fichada文档的值将是Fichada的集合。
唯一的问题是维护 map 的唯一键,但您可以使用登录表的用户名/id/唯一标识符作为两者的键。希望有帮助:)
关于java - Firebase:我使用的结构正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57510155/