我目前正在从事基于Cloud Firestore的项目。整个项目的想法是使用户能够快速,轻松地找到附近的药房,该药房以最低的成本出售一种特定的药物(一个用户会专门寻找)。该服务基于用户输入,因此整个数据库是由人们通过应用程序中的公式报告价格来创建的。
我目前面临的问题是我有3个收藏: -医学-保留基本信息(名称,药量等) -药房-保留(姓名,地址) -记录-该集合是整个问题和这篇文章的原因。它使我能够跟踪以下数据:报告作者的用户名,MedicineID,PharmacyID和其他与该问题无关的数据。
因此,该应用程序的主页是一个搜索栏,您可以在其中输入要查找的药物的名称。选择药物后,将执行查询以搜索包含给定药物名称的所有记录(文档)。然后,为了检索药房的名称和地址,我必须执行另一个查询,检索“医药名称”及其其他详细信息也是如此。这意味着我必须执行3个嵌套查询,这似乎对性能不友好。假设我有10条来自不同药房的特定药物的记录。这意味着要检索所有数据,我将不得不查询10次以获取记录,然后为每个记录查询两次以获取药房和药品。一次简单的搜索就可以减少200个查询。我对带有服务器端联接的SQL数据库很熟悉,所以这对我来说很奇怪。同样,以这种方式检索数据也需要我使用异步函数,并且要花费大量时间。
在这一点上,我很难决定是否应该以不同的方式规划数据库的结构,或者是否有更好的方法轻松地从3个不同的集合中获取数据?是否有一个简单的配方可以从多个集合中获取数据?是否应该将先前获取的数据存储在缓存中?如果是这样,那是什么形式?
这是集合的视图:
我如何从集合中获取数据的示例:
private void getPharmacyIdFromDb(final String Pharm){
FirebaseFirestore.getInstance().collection("Pharmacy").whereEqualTo("name", Pharm)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
//med.put("PharmacyID", document.getId());
med.put("Adress", document.get("adress"));
med.put("NameOfPharm", document.get("name"));
}
sendRecordToDB();
} else {
Toast.makeText(getActivity(), "Błąd!", Toast.LENGTH_LONG).show();
}
}
});
}
上面提到的方案的代码在这里: https://pastebin.com/duT0Ti3N 我在这里没有直接将其作为文本上传,因为它太多了,我认为它可能看起来并不那么相关。