【问题标题】:Reducing time complexity of firebase query降低 Firebase 查询的时间复杂度
【发布时间】:2017-04-13 02:30:38
【问题描述】:

问题

我想在 firebase 中获得 5 个随机节点,其中“STATE”值等于“ACEPTED”,我实施的两种解决方案都需要很多时间

解决方案 1:

此解决方案包括获取随机值,如果它们“STATE”等于“ACEPTED”,则将其添加到我的列表中。

private DatabaseReference mdatabas;
private List<String> keys;     

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_makequestions);

    keys=new ArrayList<>();

    mdatabas=FirebaseDatabase.getInstance().getReference()
    .child("QUESTIONS").child("SPANISH");

    getNofQuestions();
}

private void getNofQuestions(){
    mdatabas.child("QUESTIONID").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            //QUESTION ID IS EQUAL TO THE NUMBER OF QUESTIONS
            nOfQuestions=dataSnapshot.getValue(Integer.class);
            getRandom();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void getRandom(){
    getQuestion(random.nextInt(nOfQuestions-11)+11);
}

private void getQuestion(int random){
    mdatabas.child(String.valueOf(random)).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(keys.size()==4){
                Toast.makeText(getApplicationContext(),"FINISHED",Toast.LENGTH_SHORT).show();
            }
            else{

            if(dataSnapshot.child("STATE").getValue(String.class)!=null){
                if(dataSnapshot.child("STATE").getValue(String.class).equals("ACEPTED")){
                    keys.add(dataSnapshot.getKey());
                    getRandom();
                }
                else{
                    getRandom();
                }
            }
                else{
                getRandom();
            }

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

解决方案 2 基本上我得到了所有他们的状态值等于接受的问题,将它们洗牌,然后制作一个子列表。

private void getQuestions(){

    mdatabas.orderByChild("STATE").equalTo("ACEPTED").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot:dataSnapshot.getChildren()){
                keys.add(snapshot.child("ID").getValue(String.class));
            }
            Collections.shuffle(keys);
            List<String> finalKeys = keys.subList(0, 4);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

}

Json 结构(在 QUESTIONS/SPANISH 下面)

{
 "0" : {
"ID" : "0",
"MISPELLED" : 1,
"SPAM" : 1,
"STATE" : "ACEPTED",
"WRONGLANGUAGE" : 1,
"WRONGREGION" : 1
},
"1" : {
"ID" : "1",
"OPTION1" : "Elementos químicos ",
"OPTION2" : "Huesos ",
"OPTION3" : "Órganos ",
"OPTION4" : "Células ",
"QUESTION" : "La estequiologia se encarga de estudiar "
},
"2" : {
"CORRECT" : 1,
"ID" : "11",
"LIKES" : 15,
"OPTION1" : "Elementos químicos ",
"OPTION2" : "Huesos ",
"OPTION3" : "Órganos ",
"OPTION4" : "Células ",
"QUESTION" : "La estequiologia se encarga de estudiar ",
"STATE" : "ACEPTED",
"WRONG" : 1
},
"3" : {
"CORRECT" : 2,
"ID" : "12",
"LIKES" : 6,
"MISPELLED" : 2,
"OPTION1" : "Ingestión de cecaria enquistada en \r\nplanta de agua dulce.\r\n ",
"OPTION2" : "Ingestión de metacecaria enquistada en \r\nplanta de agua dulce.\r\n",
"OPTION3" : "Ingestión de metacecaria enquistada en \r\nplanta de agua salada",
"OPTION4" : "Ingestión de esporocito enquistada en \r\nplanta de agua dulce.\r\n",
"QUESTION" : "Mecanismos de transmisión de faciolopsis buski ",
"WRONG" : 3
},
 "QUESTIONID" : 3
}

所以我的问题是,是否有其他获取数据的方法或我可以对矿山进行任何改进以降低时间复杂度?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    在许多 NoSQL 数据库中很常见,为您拥有的用例建模数据。由于您希望获得一个已被接受的随机问题,因此请保留一份所需的最少信息列表。

    acceptedQuestionIds
      <questionId>: true
    

    使用这种结构,您可以加载已接受的问题 ID 列表并随机选择一个,这应该会快很多。

    一些cmets:

    【讨论】:

    • 谢谢,关于使用随机数的数字索引,我现在将转到推送 ID。
    猜你喜欢
    • 2011-06-15
    • 2012-07-28
    • 2016-10-07
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    相关资源
    最近更新 更多