2016-10-14 2 views
1

Я создаю приложение с использованием Firebase, и у меня возникли проблемы с структурированием данных для иерархии, которую требуется моему приложению.Как обрабатывать иерархические данные в Firebase?

Концепция

Мое приложение состоит из items. Каждый предмет может содержать n -many child items. В базе данных и для любого заданного элемента будет 100 000 тысяч элементов. Я хочу получить кол-во все детские предметы (т. Е .: прямые дети, внуки, правнуки и т. Д.).

Текущий пример структуры

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) загружать так называемые мелкие данные.

Так что, если ваше приложение всегда показывает все дерево, то вы можете определенно моделировать данные как дерево.

Но с учетом размера дерева гораздо более вероятно, что вы собираетесь показывать один уровень за раз, а затем разрешить пользователю нажимать, чтобы развернуть этот уровень. Если вы будете моделировать данные как иерархию, вы в конечном итоге загрузите всех дочерних узлов узла, даже когда пользователь никогда не расширит этот узел. Это расточительно.

Настолько более распространенным является сохранение иерархии в виде списка, очень похожего на то, как вы храните ее в реляционной базе данных. Затем вы сохраните отдельный список дочерних элементов каждого узла. Обратите внимание, что это список , а не дерево.

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 

Это позволяет эффективно чтения/запросов из:

  • список узлов верхнего уровня (ref.orderByChild('parentNode').equalTo(null))
  • метаданные для конкретного узла
  • родителем конкретного узла
  • детей определенного узла

Если у вас больше вариантов использования, вам может потребоваться расширить модель данных.

+1

Большое спасибо за быстрый ответ! Это то, о чем я думал, но моя забота заключается в том, как получить «totalChildCount» для любого предмета. В вашем примере это «childrenCount» только для прямых детей, или это будет для всех * детей? В любом случае, мне интересно, как лучше всего вычислить totalChildCount для данного элемента (если он должен быть установлен/увеличен при каждом добавлении элемента или если он должен быть вычислен при получении элемента. Sidenote: вы правы в том, что я не нуждаюсь во всех потомках одновременно, просто прямые дети и «totalChild * Count *» Еще раз спасибо! –

Смежные вопросы