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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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
Java 我使用的结构正确吗?_Java_Firebase_Google Cloud Firestore - Fatal编程技术网

Java 我使用的结构正确吗?

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

我正在开发一个使用Firebase作为数据库的应用程序

我一直在设计关系数据库(MySQL),我不确定我是否在设计我需要的数据库

就MySQL而言,我有3个相互关联的表。 第一个表名为“Login”,第二个表名为“Usuario”,第三个表名为“Fichada”

至于关系,“登录”与单个“Usuario”(1:1)关联,“登录”可以有多个“Fichada”(0:*)

我需要的是在非关系数据库的范例中设计相同的结构

现在我有了这样的东西:

"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数据库的最大优势之一。如果您真的不想拥有一个映射,那么提取文档的一部分将很困难,因为性能/灵活性的权衡总是存在的:)我明白了。我想我会使用这个解决方案,因为效率对我来说很重要,但这两个文档必须是相关的。谢谢你的回复:)