2016-10-14 17 views
1

私はFirebaseを使用してアプリケーションを構築しており、アプリケーションに必要な階層のデータを構造化することに問題があります。Firebaseで階層データを扱うには?

コンセプト

私のアプリがitemsで構成されています。各項目はn - 多数child itemsです。データベースには何百万ものアイテムがあります。 すべて子アイテム(直接子供、孫、孫、など)をカウントしたいと考えています。

現在の構成例

items: { 
    1: { 
     name: 'neat item 1' 
    }, 
    2: { 
     name: 'neat item 2', 
     parentId: 1 
    }, 
    3: { 
     name: 'neat item 3', 
     parentId: 2 
    } 
} 

質問

Firebaseでは、アイテムが持つ子供の数を追跡するための最良の方法は何ですか?したがって、上記の例では、項目#1に合計2つの子があり、項目#2に合計1つの子があります。

各アイテムにchildCountを維持し、新しいアイテムが追加されるたびに、その数字をすべて親として維持するのが最善でしょうか?それとも、必要なときに子カウントを再帰的に計算する方が良いでしょうか?

データベースには500,000以上のアイテムが存在し、いくつかのアイテムは合計10,000人以上の子供がいることに注意してください。

ありがとうございました!

答えて

1

Firebase(ほとんどのNoSQLデータベースのように)では、あなたのアプリがそれを使用する方法のためのデータをモデル化する必要があります(この記事をもっと知りたい場合はNoSQL data modelingを読むことを強くお勧めします)。

重要なことは、Firebaseは常にそのノードの下のすべてのデータを含むノード全体をロードすることです。いわゆる浅いデータをロードする方法(SDK内)はありません。

あなたのアプリが常にツリー全体を表示している場合は、そのデータをツリーとしてモデル化するよりも確実です。

しかし、ツリーのサイズを考えれば、一度に1つのレベルを表示してから、そのレベルをクリックしてユーザーがクリックできるようになります。データを階層としてモデル化すると、ユーザーがそのノードを展開しない場合でも、ノードのすべての子をロードすることになります。それは無駄です。

もっと一般的なのは、階層をリストとして格納することです。リレーショナルデータベースに格納する方法とよく似ています。次に、各ノードの子のリストを個別に保管します。これはリストであり、ツリーではありません。

  • 最上位ノード(ref.orderByChild('parentNode').equalTo(null)
  • 特定ノード
  • 特定のノードの親のためのメタデータのリスト:

    nodes 
        nodeKey1 
        name: "Node 1" 
        childrenCount: 2 
        nodeKey2 
        name: "Node 2" 
        childrenCount: 1 
        parentKey: "nodeKey1" 
        nodeKey3 
        name: "Node 3" 
        childrenCount: 0 
        parentKey: "nodeKey1" 
        nodeKey4 
        name: "Node 4" 
        childrenCount: 0 
        parentKey: "nodeKey2" 
    nodeChildren 
        nodeKey1 
        nodeKey2 
        nodeKey3 
        nodeKey2 
        nodeKey4 
    

    これは、効率的に読み取り/照会を可能にします

  • 特定のノードの子孫

ユースケースがさらに多い場合は、データモデルを拡張する必要があります。

+1

すばらしい返答をいただきありがとうございます。これは私が考えていたものですが、私の懸念は、どのアイテムに対しても "totalChildCount"を得る方法です。あなたの例では、直接的な子供の場合のみ "childrenCount"ですか、それとも*すべての子供の場合ですか?いずれにしても、アイテムが追加されるたびに増減する必要がある場合、またはアイテムが取得されたときに計算される必要がある場合は、特定のアイテムのtotalChildCountを効率的に計算する最良の方法が不思議です。私は一度にすべての子どもたちを必要としない、ちょうど子供たちと "totalChild * Count *"を教えてくれてありがとう!もう一度ありがとう!! –