为文档的名称提供UID

时间:2017-10-24 16:22:16

标签: android firebase google-cloud-firestore

我想知道在我的firestore数据库中保存用户首选项的最佳做法是什么。 我试着用一个例子来解释......

<案例1

我的“用户”集合中有这种文档(名称由Firebase随机生成),包含3个字段:

  • user_uid :字符串
  • 昵称:字符串
  • android_lover :boolean

在我的Android项目中,当我想搜索用户文档“DFDDE45554SDC”时,我搜索user_uid =“DFDDE45554SDC”的位置。

<案例2

我的“users”集合中有这种文档(名称是用用户的UID创建的),有2个字段:

  • 昵称:字符串
  • android_lover :boolean

在我的Android项目中,当我想搜索用户文档“DFDDE45554SDC”时,我只搜索文档“DFDDE45554SDC”。

我指定:我不想要重复的用户。 那么,什么是最佳实践(安全性,优化......)?为什么?

1 个答案:

答案 0 :(得分:4)

我建议Case 2更有效,原因如下:

  • 我们已经知道用户的ID,因此不需要在此处使用其他ID。
  • 使用usersCollection.document(userId)很容易构建,而且是直接DocumentReference,而不是Query,因此:
    • DocumentReference可以存储在Firestore数据库中,而Query则不能。
    • DocumentReference可能比指示Firestore数据库使用whereEqualTo("user_uid", userId)执行过滤查询更好(尽管使用索引,此时性能差异可能微不足道)。
    • Query将始终返回结果集合(即使只有1),而不是确切的文档。
  • 目前还不需要为用户集合中的每个文档生成不同的随机生成的ID,因为用户ID已经是唯一的。
  • 每个用户只需要1个文档,因此这是确保不会出现任何重复文件的可靠方法。

我能想到使用Case 1的唯一真正诱因是将文档命名方案与数据库中的其他集合标准化,但这对Firestore来说并不重要。

有关Android中两者的快速示例:

案例1

db.collection("users")
    .whereEqualTo("user_uid", "DFDDE45554SDC")
    .limit(1)
    .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (DocumentSnapshot document : task.getResult()) {
                    // Even with limit(1), we still receive a collection
                    // so iterate this to obtain the desired document
                }
            }
        }
    });

案例2

db.collection("users")
    .document("DFDDE45554SDC")
    .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful() && task.getResult() != null) {
                // We have access to the single desired document directly
                DocumentSnapshot document = task.getResult();
            }
        }
    });