Firestore中对象嵌套数组的数据模型

问题描述 投票:0回答:1

我需要经验丰富的NoSQL工程师有关如何构造数据的建议。

  • 我想将我的SQL数据结构建模为Google Cloud Firestore的NoSQL。
  • 我以前没有使用NoSQL数据库的经验,但是我精通传统SQL。
  • 我使用Node.js编写查询。

到目前为止,我已将三个表转换为带有示例数据的JSON文档:

{
  "session": {
      "userId": 99992222,
      "token": "jwttoken1191891j1kj1khjjk1hjk1kj1",
      "created": "timestamp"
  }
}
{
  "user": {
    "id": 99992222,
    "username": "userName",
    "avatarUrl": "https://url-xxxx.com",
    "lastLogin": "2019-11-23 13:59:48.884549",
    "created": "2019-11-23 13:59:48.884549",
    "modified": "2019-11-23 13:59:48.884549",
    "visits": 1,
    "profile": true,
    "basketDetail": { // I get this data from a third party API
      "response": { 
        "product_count": 2,
        "products": [
          {
            "product_id": 111,
            "usageInMinutes_recent": 0,
            "usageInMinutes": 0,
            "usageInMinutes_windows": 0,
            "usageInMinutes_mac": 0,
            "usageInMinutes_linux": 0
          },
          {
            "product_id": 222,  // no recent usage here
            "usageInMinutes": 0,
            "usageInMinutes_windows": 0,
            "usageInMinutes_mac": 0,
            "usageInMinutes_linux": 0
          }
        ]
      }
    }
  }
}
{
  "visitor": {
    "id": 999922221,
    "created": "2019-11-23 13:59:48.884549"
  }
}

我的问题:

  1. session.userId,user.id,visitor.id都可以表示同一用户。 Firestore与SQL中的外键等效是什么?如何在查询中连接/加入这三个集合?
  2. 对嵌套对象basketDetail怎么办?它在哪里好还是应该定义自己的收藏集?我希望查询

    • 偶尔添加所有最近的用法。
    • 经常检查用户是否拥有特定的product_id
    • 经常用新数据替换整个baskedDetail对象。
    • 偶尔更新一个特定的product_id。
  3. 如果我将集合user与查询中的basketDetail分开,该如何连接?

感谢您的建议!

node.js firebase google-cloud-firestore nosql data-modeling
1个回答
0
投票
  1. session.userId,user.id,visitor.id都可以表示同一用户。 Firestore与SQL中的外键等效是什么?如何在查询中连接/加入这三个集合?

[很遗憾,Firestore中没有JOIN子句。 Firestore中的查询很浅,只能从运行查询的集合中获取元素。除非您使用collection group query,否则无法在单个查询中从两个集合中获取文档,但事实并非如此,因为项目中的集合名称不同。

如果您有三个集合,则需要三个单独的查询。您不可能一口气做到这一点。

  1. 如何处理嵌套对象basketDetail?在哪里好还是应该定义自己的收藏集?

关于可以放入文档中的数据量有一些限制。根据有关usage and limits的官方文档:

文档的最大大小:1 MiB(1,048,576字节)

如您所见,单个文档中的数据总数限制为1 MiB。因此,如果您认为嵌套对象basketDetail可以保持在此限制内,则可以使用该架构,否则,请将其添加到子集合中。除此之外,所有这些操作都可以在Firestore中进行。如果您在实施它们时遇到困难,请提出另一个问题,以便我们进行研究。

如果我将集合用户与查询中的basketDetail连接起来,怎么办?

您无法连接/加入两个收藏夹。如果在子集合中分离basketDetail,则需要两个查询。

© www.soinside.com 2019 - 2024. All rights reserved.