我想知道在我的firestore数据库中保存用户首选项的最佳做法是什么。 我试着用一个例子来解释......
<案例1我的“用户”集合中有这种文档(名称由Firebase随机生成),包含3个字段:
在我的Android项目中,当我想搜索用户文档“DFDDE45554SDC”时,我搜索user_uid =“DFDDE45554SDC”的位置。
<案例2我的“users”集合中有这种文档(名称是用用户的UID创建的),有2个字段:
在我的Android项目中,当我想搜索用户文档“DFDDE45554SDC”时,我只搜索文档“DFDDE45554SDC”。
我指定:我不想要重复的用户。 那么,什么是最佳实践(安全性,优化......)?为什么?
答案 0 :(得分:4)
我建议Case 2
更有效,原因如下:
usersCollection.document(userId)
很容易构建,而且是直接DocumentReference
,而不是Query
,因此:
DocumentReference
可以存储在Firestore数据库中,而Query
则不能。DocumentReference
可能比指示Firestore数据库使用whereEqualTo("user_uid", userId)
执行过滤查询更好(尽管使用索引,此时性能差异可能微不足道)。Query
将始终返回结果集合(即使只有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();
}
}
});