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

Joh*_*ews 0 database database-design nosql firebase

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

该数据库存储产品信息,具有三个主要属性:

$productId          
     /date           
     /category           
     /subcategory
Run Code Online (Sandbox Code Playgroud)

在我的网站上,我有三种看法:

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

请注意,我还有一个节点product_images,其子节点与productID匹配。因此,按以下方式构造数据库:

$categoryId
        $subCategoryId 
               $productId
Run Code Online (Sandbox Code Playgroud)

无法使用,因为我需要事先知道$ categoryId和$ subCatrgoryId,然后才能将其与$ productId匹配。这也将使检索最后4个产品变得困难。

我将如何高效地构建noSQL数据库,以及如何使用Firebase筛选出具有多个限制的产品来检索产品?

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

Fra*_*len 5

由于Firebase只能过滤一个属性,因此您必须将要过滤的值组合到一个属性中。由于您有多种过滤需求,因此每个过滤用例可能都需要一个这样的属性。

如果您将其合并<category>_<date>为一个属性(我们称为),那么看来这对您来说是可能的multi-prop。我们还将合并<category>_<subcategory>_<date>为一个名为megaprop

$productId          
    /date           
    /category           
    /subcategory
    /multiprop
    /megaprop
Run Code Online (Sandbox Code Playgroud)

一些样本数据:

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
Run Code Online (Sandbox Code Playgroud)

现在,您的查询变成:

  1. 检索最后4个产品

    ref.orderByChild('date').limitToLast(4);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检索类别X的最后4个产品

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

    ref.orderByChild('megaprop').startAt('candy_christmas').endAt('candy_christmas_~').limitToLast(4);
    
    Run Code Online (Sandbox Code Playgroud)

另请参见:http : //jsbin.com/piluzo/edit?js,可运行的控制台。

  • 这个答案是正确的,根据您的平台,还有其他几种选择。我们发现,查询所有Candy并将结果放入数组中,然后(ObjC)NSPredicate从该数组中“过滤”出我们想要的数据(圣诞节)效果很好(取决于数据集的大小)。另外,以不同的方式构造数据;有一个christmas_candy节点和一个thanksgiving_candy节点,其子节点包含对主candy节点中相应子节点的引用。这使您可以访问“数组”,可以对其进行迭代以从主Candy节点检索所需的数据。 (3认同)