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模式无法模拟所需的结构。)
答案 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数据轻松完成,但如果存储在数组中则不容易完成,因为必须读入整个数组。