在JSON模式中建模Firebase实时数据库

时间:2016-08-12 16:17:25

标签: firebase firebase-realtime-database jsonschema

Firebase数据库使用JSON的子集。因此,使用JSON模式来描述数据模型似乎是显而易见的。这将允许使用从中生成HTML表单或打字稿模型的工具或生成随机测试数据。

我的问题:如何在JSON架构中建模键值对,其中键是id?

示例:(借鉴firebase spec

  {
    "users": {
      "mchen": {
        "name": "Mary Chen",
        // index Mary's groups in her profile
        "groups": {
           // the value here doesn't matter, just that the key exists
           "alpha": true,
           "charlie": true
        }
      },
      ...

此处的组名称用作组ID。在此引用(groups对象)以及组对象本身中,id用作属性名称。

以上示例的JSON模式是:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "users": {
      "type": "object",
      "properties": {
        "mchen": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "groups": {
              "type": "object",
              "properties": {
                "alpha": {
                  "type": "boolean"
                },
                "charlie": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    }
  }
}

我需要的示例如下所示,其中NAME是属性名称的占位符,NAME_TYPE定义了它的类型。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "users": {
      "type": "object",
      "properties": {
        NAME: {
          "type": "object",
          NAME_TYPE: "string",
          "properties": {
            "name": {
              "type": "string"
            },
            "groups": {
              "type": "object",
              "properties": {
                NAME: {
                  NAME_TYPE: "string"
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    }
  }
}

(也许我在这里完全错误的路径或者JSON模式无法模拟所需的结构。)

1 个答案:

答案 0 :(得分:0)

Firebase中肯定存在数组,但它们是情境性的,应该仅在某些用例中使用,通常应该避免使用。

你发布的Firebase结构非常常见,你的结构中有关键:值对,所以问题有点不清楚,但我会试一试。

'groups'是父键,值是子键:group1的值对:value,group2:value。

您列出的group1,group2键与第一个示例中列出的id基本相同,除了它不是数组。即,数组具有顺序的硬编码索引(0th,1st,2nd等),而firebase中的键是开放式的,通常可以设置为任何字母数字值 - 它们更多地用于引用特定节点而不是强制执行特别的顺序(我一般在这里说)

在Firebase结构中,这些键可以是id0,id1,id2 ......或者a,b,c ...或时间戳...或者自动生成的Firebase ID(childByAutoId)也可以生成它们'顺序'。

但是,您可能会遇到使用id0,id1等分配自己的问题。

id0
id1
id2
.
id9
id10
id11

现实情况是实际的顺序是

id0
id1
id10
id11
id2

“密钥”是指如果您使用密钥按顺序读取数据,请将其设置为这样。您可能还需要考虑使用childByAutoId生成密钥(请参阅语言特定的文档)和orderBy其中一个子值,例如时间戳或索引。

'groups': {
  'auto-generated id': {
    'name': 'alpha',
    'index': 0,
    'timestamp': '20160814074146'
    ...
  },
  'auto-generated id': {
    'name': 'charlie',
    'index': 1,
    'timestamp': '20160814073600'
    ...
  },
  ...
}

在上面的例子中,我可以命名,名称,索引或时间戳。

名称和索引将按照列出的顺序读取节点,如果按时间戳排序,则首先加载charlie节点。利用子值来命令它非常灵活。

此外,您可以使用startingAt和endingAt限制要加载的数据集。因此,例如,您希望加载从节点10开始并在节点14结束的节点。使用非数组JSON数据轻松完成,但如果存储在数组中则不容易完成,因为必须读入整个数组。