Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对多限制查询的NoSQL数据库设计(Firebase)_Firebase_Database Design_Database_Nosql - Fatal编程技术网

针对多限制查询的NoSQL数据库设计(Firebase)

针对多限制查询的NoSQL数据库设计(Firebase),firebase,database-design,database,nosql,Firebase,Database Design,Database,Nosql,我需要最佳实践技巧来提高我的noSQL数据库(托管在Firebase上)的性能。此外,我需要关于如何构造节点的技巧 数据库存储产品信息,具有三个主要属性: $productId /date /category /subcategory 在我的网站上,我有三种观点: 检索最后4种产品(按订单日期) 检索X类的最后4个产品(按日期) 检索类别X和子类别Y的最后4个产品(按日期) 注意,我还有一个节点p

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

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

$productId          
     /date           
     /category           
     /subcategory
在我的网站上,我有三种观点:

  • 检索最后4种产品(按订单日期)
  • 检索X类的最后4个产品(按日期)
  • 检索类别X和子类别Y的最后4个产品(按日期)
注意,我还有一个节点product_images,它有与ProductID匹配的子节点。因此,按如下方式构建数据库:

$categoryId
        $subCategoryId 
               $productId
不会工作,因为我需要事先知道$categoryId和$subCatrgoryId,然后才能将其与$productId匹配。这也会使检索最后4种产品变得困难

我将如何高效地构建noSQL数据库,以及如何使用Firebase检索产品,并使用多种限制将其过滤掉


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

由于Firebase只能对一个属性进行筛选,因此您必须将要筛选的值合并到单个属性中。因为您有多个过滤需求,所以对于每个过滤用例,您可能需要这样一个属性

如果您将
\uuu
合并到一个属性中,这似乎对您是可能的,我们将其称为
多属性
。我们还将把
\uuu
合并到一个名为
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
现在您的查询变成:

  • 检索最后4个产品

    ref.orderByChild('date').limitToLast(4);
    
  • 检索X类的最后4个产品

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

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

  • 另请参见:获取工作版本。

    由于Firebase只能对一个属性进行筛选,因此必须将要筛选的值合并到单个属性中。因为您有多个过滤需求,所以对于每个过滤用例,您可能需要这样一个属性

    如果您将
    \uuu
    合并到一个属性中,这似乎对您是可能的,我们将其称为
    多属性
    。我们还将把
    \uuu
    合并到一个名为
    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
    
    现在您的查询变成:

  • 检索最后4个产品

    ref.orderByChild('date').limitToLast(4);
    
  • 检索X类的最后4个产品

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

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

  • 另请参见:获取工作版本。

    绝对有意义!再加上,假设我有10000个产品和20个分类。我正在1视图上查询类别。如果我在节点产品上查询20次,而不是在每个类别上查询一次,那么速度会慢些吗?因此在产品/$categoryId上查询?刚刚尝试过,不幸的是,这不起作用。它剔除了所有以candy开始的产品,而不是仅candy_Christmast。这个答案是正确的,根据您的平台,还有其他几种选择。我们发现,查询所有糖果并将结果放入一个数组,然后(ObjC)NSPredicate从该数组中“过滤”我们想要的数据(圣诞节),效果很好(取决于数据集大小)。此外,以不同的方式构建数据;具有圣诞糖果节点和感恩节糖果节点,其中其子节点包含对主糖果节点中相应子节点的引用。这使您可以访问一个“数组”,该数组可以通过迭代从主candy节点检索所需的数据。这绝对有意义!再加上,假设我有10000个产品和20个分类。我正在1视图上查询类别。如果我在节点产品上查询20次,而不是在每个类别上查询一次,那么速度会慢些吗?因此在产品/$categoryId上查询?刚刚尝试过,不幸的是,这不起作用。它剔除了所有以candy开始的产品,而不是仅candy_Christmast。这个答案是正确的,根据您的平台,还有其他几种选择。我们发现,查询所有糖果并将结果放入一个数组,然后(ObjC)NSPredicate从该数组中“过滤”我们想要的数据(圣诞节),效果很好(取决于数据集大小)。此外,以不同的方式构建数据;具有圣诞糖果节点和感恩节糖果节点,其中其子节点包含对主糖果节点中相应子节点的引用。这使您可以访问一个“数组”,该数组可以被迭代以从主节点检索所需的数据。