2015-10-26 3 views
0

Мне нужны советы по лучшей практике для повышения производительности моей базы данных noSQL (размещенной на Firebase). Более того, мне нужны советы о том, как структурировать узлы.Конструкция базы данных NoSQL для запросов с несколькими ограничениями (Firebase)

Информация База данных хранит продукт, с тремя основными свойствами:

$productId   
    /date   
    /category   
    /subcategory 

На моем сайте, у меня есть три вида:

  • извлечь последние 4 продукта (дата OrderBy)
  • получить последние 4 статьи (по дате) категории X
  • последние 4 изделия (по дате) категории X и подкатегория Y.

Обратите внимание, что у меня также есть узел product_images, у которого есть подносы, соответствующие идентификаторам productID. Так построения databas следующим образом:

$categoryId 
     $subCategoryId 
       $productId 

не будет работать, как мне нужно знать заранее $ CategoryId и $ subCatrgoryId, прежде чем я могу сравнить его с $ ProductID. Это также затруднит получение последних 4 продуктов.

Как я могу построить свою базу данных noSQL эффективным образом и как я могу получить продукты с Firebase, фильтруя их с несколькими ограничениями?

Я знаю, что в Firebase вы можете использовать orderByChild и equalTo, но это работает только на одном ограничении, тогда как мне приходится иметь дело с одним-тремя.

ответ

4

Поскольку Firebase может фильтровать только одно свойство, вам необходимо объединить значения, которые вы хотите фильтровать, в одно свойство. Поскольку у вас есть несколько требований к фильтрации, вам может понадобиться такое свойство для каждого случая использования фильтрации.

Кажется, что это будет возможно для вас, если вы объедините <category>_<date> в одно свойство, которое мы назовем multi-prop. Мы также объединить <category>_<subcategory>_<date> в собственность под названием megaprop:

$productId   
    /date   
    /category   
    /subcategory 
    /multiprop 
    /megaprop 

Некоторые образцы данных:

id_cc_1234 
    date: 20151031 
    category: candy 
    subcategory: halloween 
    multiprop: candy_20151031 
    megaprop: candy_halloween_20151031 
id_tg_2345 
    date: 20151125 
    category: candy 
    subcategory: thanksgiving 
    multiprop: candy_20151125 
    megaprop: candy_thanksgiving_20151125 
id_tg_3456 
    date: 20151125 
    category: food 
    subcategory: thanksgiving 
    multiprop: food_20151125 
    megaprop: food_thanksgiving_20151125 
id_sk_4567 
    date: 20151205 
    category: candy 
    subcategory: sinterklaas 
    multiprop: candy_20151205 
    megaprop: candy_sinterklaas_20151205 
id_sc_5678 
    date: 20151225 
    category: candy 
    subcategory: christmas 
    multiprop: candy_20151225 
    megaprop: candy_christmas_20151225 

Теперь ваши запросы превращаются в:

  1. получить последние 4 продукты

    ref.orderByChild('date').limitToLast(4); 
    
  2. получить последние 4 продуктов категории X

    ref.orderByChild('multiprop').startAt('candy').endAt('candy_~').limitToLast(4); 
    
  3. RETRIEVE 4 последних продуктов категории X и Y. подкатегории

    ref.orderByChild('megaprop').startAt('candy_christmas').endAt('candy_christmas_~').limitToLast(4); 
    

Смотрите также: http://jsbin.com/piluzo/edit?js,console для рабочей версии.

+0

Определяет смысл!Просто добавлю, скажем, у меня 10000 продуктов и 20 категорий. Я запрашиваю категории на одном представлении. Будет ли это медленнее, если я запрошу 20 раз на продукты узла по сравнению с одним раз для каждой категории, таким образом, по продуктам/$ categoryId? – JohnAndrews

+0

Просто попробовал, к сожалению, это не работает. Он принимает все продукты, которые начинаются с конфеты, а не только candy_christmas – JohnAndrews

+3

Этот ответ верен, и есть несколько других вариантов в зависимости от вашей платформы. Мы обнаружили, что запрос всей Candy и помещение результатов в массив, а затем (ObjC) NSPredicate для «фильтрации» данных, которые мы хотим (рождество) из этого массива, работают хорошо (в зависимости от размера набора данных). Кроме того, структурирование ваших данных по-разному; есть узел christmas_candy и узел thanksgiving_candy, где их дети содержат ссылки на соответствующие дочерние элементы в основном конфетном узле. Это дает вам доступ к «массиву», который можно повторить для получения данных, которые вы хотите, с основного конфетного узла. – Jay

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