ホームページ > Java > &#&チュートリアル > ノード内の大規模な Firebase データベースからランダムな製品を効率的に選択するにはどうすればよいですか?

ノード内の大規模な Firebase データベースからランダムな製品を効率的に選択するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-29 06:12:31
オリジナル
302 人が閲覧しました

How to Efficiently Select Random Products from a Large Firebase Database in Node?

Node Firebase で一意のランダムな製品を取得する

1,000 レコード以上のノード データベースから 1 つのランダムな製品を取得するには、次の 2 つのアプローチを検討します。古典的なソリューションと非正規化アプローチ。

古典的なソリューション

<br>ListView listView = (ListView) findViewById(R.id.list_view);<br>ArrayAdapter arrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, randomProductList);<br>listView.setAdapter(arrayAdapter);<br>DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); <br>DatabaseReference productsRef = rootRef.child("products"); // .child("products")<br>ValueEventListener valueEventListener = new ValueEventListener() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    List<String> productList = new ArrayList<>();
    for(DataSnapshot ds : dataSnapshot.getChildren()) {
        String name = ds.child("name").getValue(String.class);
        productList.add(name);
    }

    int productListSize = productList.size();
    List<String> randomProductList = new ArrayList<>();

    randomProductList.add(new Random().nextInt(productListSize)); //Add the random product to list
    arrayAdapter.notifyDatasetChanged();
}

@Override
public void onCancelled(DatabaseError databaseError) {
    Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
}
ログイン後にコピー

};
productsRef.addListenerForSingleValueEvent(valueEventListener);

このアプローチは、すべてのプロダクト ノードをループし、それらの名前をリストに追加し、ランダムに 1 つを選択します。

非正規化アプローチ

大量のデータのダウンロードを避けるために別の「productIds」ノードを作成します:

<br>Firebase-root<br> |<br> --- products<br> |     |<br> |     --- productIdOne<br> |     |      |<br> |     |      --- //詳細<br> |     |<br> |     --- productIdTwo<br> |            |<br> |            --- //詳細<br> |      <br> --- productIds</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">      |
      --- productIdOne: true
      |
      --- productIdTwo: true
      |
      --- //And so on
ログイン後にコピー

<br>DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();<br> DatabaseReference productIdsRef = rootRef.child("productIds");<br>ValueEventListener valueEventListener = new ValueEventListener() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    List<String> productIdsList = new ArrayList<>();
    for(DataSnapshot ds : dataSnapshot.getChildren()) {
        String productId = ds.getKey();
        productIdsList.add(productId);
    }

    int productListSize = productList.size();
    List<String> randomProductList = new ArrayList<>();

    DatabaseReference productIdRef = rootRef.child("products").child(productIdsList.get(new Random().nextInt(int productListSize));
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String name = dataSnapshot.child("name").getValue(String.class);
            Log.d("TAG", name);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
        }
    };
    productIdRef.addListenerForSingleValueEvent(eventListener);
}

@Override
public void onCancelled(DatabaseError databaseError) {
    Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
}
ログイン後にコピー

};
productIdsRef.addListenerForSingleValueEvent(valueEventListener);

このアプローチでは、「productIds」ノードをクエリしてランダムな製品 ID を取得し、次に「products」ノードをクエリして特定の詳細を取得します。

以上がノード内の大規模な Firebase データベースからランダムな製品を効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:変数が長いものとして宣言されているにもかかわらず、長いリテラルに対して Java が「範囲外」エラーをスローするのはなぜですか? 次の記事:Eclipse プロジェクト構成ファイルをバージョン管理する必要がありますか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート