具有多个限制的查询的NoSQL数据库设计(Firebase)

时间:2015-10-26 00:27:11

标签: firebase database-design database nosql

我需要最佳实践提示来增强noSQL数据库(托管在Firebase上)的性能。此外,我需要有关如何构建节点的提示。

数据库存储产品信息,包含三个主要属性:

$categoryId
        $subCategoryId 
               $productId

在我的网站上,我有三种观点:

  • 检索最后4个产品(orderBy date)
  • 检索类别X的最后4个产品(按日期)
  • 检索类别X和子类别Y的最后4个产品(按日期)。

请注意,我还有一个节点product_images,其子节点与productID匹配。所以构建数据库如下:

{{1}}

无法正常工作,因为我需要先知道$ categoryId和$ subCatrgoryId,然后才能将它与$ productId匹配。这也很难找回最后4种产品。

我如何以有效的方式构建我的noSQL数据库?如何使用Firebase检索产品,并将其过滤出来并有多种限制?

我知道在Firebase中你可以使用orderByChild和equalTo,但这只适用于一个限制,而我必须处理一到三个。

1 个答案:

答案 0 :(得分:5)

由于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. 检索X类别的最后4个产品

    ref.orderByChild('multiprop').startAt('candy').endAt('candy_~').limitToLast(4);
    
  3. 检索类别X和子类别Y的最后4个产品。

    ref.orderByChild('megaprop').startAt('candy_christmas').endAt('candy_christmas_~').limitToLast(4);
    
  4. 另请参阅:http://jsbin.com/piluzo/edit?js,console了解工作版本。