用于编号项目的Firestore最佳数据结构

时间:2019-12-06 12:57:26

标签: firebase google-cloud-firestore

我有一个类别列表,应该在前端以某种方式对其进行排序。此外,该类别中的商品也应订购。

想象一下,一家餐馆提供多种食物:晚餐,甜点,鸡尾酒 每个类别都包含多个项目。

在前端,我想按照可以手动设置的特定顺序显示类别和项目。但是,我不确定该用例需要使用哪种数据类型和结构。

它可能看起来像这样:

------------------ FANCY RESTAURANT -----------------

--------- Dinner (Order 1, shown first) ------------
Dinner 1
Dinner 2

--------- Dessert (Order 2, shown second) ----------
Dessert 1
Dessert 2
Dessert 3 
--------- Cocktails (Order 3, shown third) -----------
Cocktail 1
......

我的想法是这样的:

restaurants (collection)
    - name, id, etc.
    - array of categories
        * map with: category_name, array of menuItems 
    - subcollection (menuItems)

在这种情况下,menuItems数组将只是具有该类别中项目ID的数组。使用数组索引可以进行排序。

这可以通过某种方式加以改进吗?这样做有一个缺点,那就是在前端,我实际上需要遍历menuItems数组中的每个id,并且必须将它们与存储在子集合中的实际menuItem相匹配。我觉得使用非规范化的数据可能会更简单,但我不确定。

1 个答案:

答案 0 :(得分:1)

根据您的评论:

  

获取所有餐厅的列表,获取单个餐厅的信息,获取餐厅的所有menuItems的信息,获取所有未分类的menuItems的列表(例如:甜点:[menuItem1,menuItem2],晚餐:[menuItem3,menuItem4])< / p>

可能的数据库模式可能是:

Firestore-root
   |
   --- restaurants (collection)
         |
         --- restarantId (document)
               |
               --- name: "Fancy Restaurant"
               |
               --- menuItems (subcollection)
                    |
                    --- menuItemId (document)
                         |
                         --- name: "Pizza"
                         |
                         --- category: "dinner"

要获取所有餐厅,您需要使用以下馆藏参考:

rootRef.collection("restaurants");

如果您需要一家餐厅,则需要使用以下文档参考:

rootRef.collection("restaurants").document(restarantId);

如果需要获取餐厅的所有菜单项,则需要使用以下馆藏参考:

rootRef.collection("restaurants").document(restarantId).collection("menuItems");

如果您需要按类别获取餐厅的所有菜单项,则需要使用以下查询

rootRef.collection("restaurants").document(restarantId)
    .collection("menuItems").whereEqualTo("category", "dinner");

由于您未指定要使用的编程语言,因此我提供了Android的代码,但在我看来,其他编程语言也是如此。