【问题标题】:How to structure Firebase Database如何构建 Firebase 数据库
【发布时间】:2016-09-11 10:59:17
【问题描述】:

我正在为我的移动和网络应用程序使用 Firebase 数据库。我想获得有关如何构建 JSON 树的建议。我想到了以下用例:

移动应用用户登录并获取列表中的所有附近餐厅。用户在一家餐厅设置订单。餐厅老板使用网络或移动应用程序查看收到的订单并接受订单。接受订单后,移动应用用户会收到订单已被接受的响应。现在我对结构的想法如下:

所以我们在顶层为每个restaurant 设置一个节点,每个restaurant 节点包含一个requests 节点,用于保存对该餐厅的所有请求。

这种结构可以吗,或者可以更好地结构吗?

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • 在 NoSQL 中,您通常会根据应用程序使用数据的方式对数据进行建模。要获得良好的介绍,请阅读NoSQL data modeling 上的这篇文章。

标签: android firebase firebase-realtime-database


【解决方案1】:

考虑这样的数据结构,您不希望在获得餐厅时检索所有请求,这样您就可以获取餐厅的所有请求以及来自特定用户的所有请求。

{
    "requests": {
        "req1": {
            "status": 0,
            "time": 1473593287,
            "user": { "u2": true }
        },
        "req2": {
            "status": 0,
            "time": 1473593227,
            "user": { "u1": true }
        },
        "req3": {
            "status": 0,
            "time": 1473594287,
            "user": { "u1": true }
        },
        "req4": {
            "status": 0,
            "time": 1473594227,
            "user": { "u2": true }
        },
    },
    "restaurant-requests": {
        "resA": {
            "req1": true,
            "req2": true
        },
        "resB": {
            "req3": true,
            "req4": true
        }
    },
    "restaurants": {
        "resA": {
            "name": "Example Restaurant A",
            "address": "1 Example Street"
        },
        "resB": {
            "name": "Example Restaurant B",
            "address": "2 Example Street"
        }
    },
    "user-requests": {
        "u1": {
            "req2": true,
            "req3": true
        },
        "u2": {
            "req1": true,
            "req4": true
        }
    },
    "users": {
        "u1": {
            "address": "123 Example Street"
        },
        "u2": {
            "address": "124 Example Street"
        },
    },
}

【讨论】:

  • 但这意味着如果有新的请求。我必须通过android代码向requests节点添加一个节点,向restaurant-requests\resX节点添加一个额外节点,向user-requests\uX节点添加一个额外节点,对吧?或者有没有一种方法,只有一个查询可以通过一个查询完成所有这些更改?
  • 如果您担心必须更新这两个引用,您可以使用多个更新位置在一个查询中处理它
  • 习惯的力量,我用 swift 编写了一个 FIRDataObject 类,它将快照转换为对象,并要求关系采用该格式。
  • 所以request/req1/user 的快照给出了{"u2": true},它可以转换为一个用户对象,其键为u2,但值为true。但是现在您有了一个用户对象,其中包含您可以请求完整 json 的密钥。
  • 您可能想观察 /restaurant-requests/{restaurant-id},这将为您提供餐厅的所有请求 ID,然后您可以在 /requests/{request-id 交叉引用} 检查请求的具体细节,如发送请求的用户等。
【解决方案2】:

这就是我会做的.. 祝你好运!

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 2017-10-19
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多