Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        6个月前关闭。
                                                                                            
                
        
我正在开发使用Firebase作为数据库的应用程序。

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

在MySQL方面,我有3个相互关联的表。
第一个表称为“登录”,第二个表称为“ Usuario”,第三个表称为“ Fichada”

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

Diagram

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

现在我有这样的事情:

"Login":
    "atribute1" : value1
    "atribute2" : value2

    "Usuario": {
         "atribute3" : value3
         "atribute4" : value4
    }

    "Collection<Fichada>": {
         "atribute5" : atribute5
    }


我有一个名为“登录”的文档,里面有另一个名为“ Usuario”的文档和一个名为“ Fichada”的文档集合

我需要知道这是否正确。我很怀疑,因为当我进入应用程序时,用户必须输入他们的登录信息,而那时我根本不需要“ Fichada”中包含的信息。问题是我不知道什么时候只能获取自己需要的信息(当我获得登录文档时,我会自动获取“ Usuario”和所有“ Fichada”文档)。
在一个所谓的拥有15.000.000“ Fichada”的案例中,我不想全部带走,但是由于我从Firebase带来的是Login对象而不是“ 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());


这样,每当我获得“登录”实体时,我也会获得所有“ 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文件的价值将是Fichadas的集合。

唯一的问题是维护地图的唯一键,但是您可以将登录表的用户名/标识/唯一标识符用作两者的键。希望有帮助:)

08-16 14:38