Firebase数据结构的想法

时间:2016-04-24 22:45:29

标签: javascript firebase firebase-realtime-database nosql

我在POS系统工作,我正在使用Firebase作为后端。我需要做的一个报告是“大多数/少卖的产品”。

我有这样的结构/sales/

"1234": {
    "date": 1234567890, // timestamp
    "products": {
        "coca-cola-clasica-355-ml": {
            "quantity": 3,
            "salesPrice": 500,
            "costPrice": 400
        },
        "coca-cola-clasica-600-ml": {
            "quantity": 6,
            "salesPrice": 900,
            "costPrice": 700
        }
    },
    "subtotal": 6400,
    "total": 6400
},
"5678": {
    "date": 1234567890, // timestamp
    "products": {
        "taqueritos-chile-picante": {
            "quantity": 2,
            "salesPrice": 100,
            "costPrice": 80
        },
        "coca-cola-clasica-600-ml": {
            "quantity": 4,
            "salesPrice": 900,
            "costPrice": 700
        }
    },
    "subtotal": 200,
    "total": 200
}

和/ products /:

{
    "coca-cola-clasica-355-ml": {
        "costPrice": 350,
        "name": "Coca Cola Clasica 355 ml",
        "salesPrice": 500,
        "stock": 99,
        "supplier": "femsa-coca-cola",
        "tax": false,
    },
    "coca-cola-clasica-600-ml": {
        "costPrice": 700,
        "name": "Coca Cola Clasica 600 ml",
        "salesPrice": 900,
        "stock": 99,
        "supplier": "femsa-coca-cola",
        "tax": false,
    },
    "taqueritos-chile-picante": {
        "costPrice": 80,
        "name": "Taqueritos Chile Picante",
        "salesPrice": 100,
        "stock": 500,
        "supplier": "dinant",
        "tax": true
    }
}

因此,如果我现在必须获得“销售量最大的产品”,我必须遍历所有销售并在每次找到产品时添加数量,之后订购结果并获得销售最多的产品,这很糟糕。

我有两个想法可以解决这个问题:

  1. 将属性添加到/products/,例如“soldTimes”,并在每次销售产品时添加数量。
  2. 创建第三个实体调用,例如soldProducts,并在每次客户购买时计算每个实体的销售数量。
  3. 这两种方法中的任何一种都有效吗?我在Firebase中遗漏了什么?

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在NoSQL中,您通常最终会根据应用程序使用它的方式对数据进行建模。因此,如果您的应用需要拥有大多数已售出产品的列表,则应考虑将该列表存储在数据库中。

productLeaderboard: {
    coca-cola-clasica-355-ml: {
        totalQuantity: 3,
        totalSalesPrice: 500,
        totalCost: 400,
        totalProfit: 100
    },
    ...
}

现在找到销量最多的产品,你可以做到:

ref.child('productLeaderboard').orderByChild('totalQuantity').limitToFirst(3).on(...