2016-08-12 13 views
1

FirebaseデータベースはJSONのサブセットを使用します。したがって、JSONスキーマを使用してデータモデルを記述することは明らかです。これにより、HTMLフォームまたはタイプスクリプトモデルを生成するツールを使用したり、ランダムなテストデータを生成したりすることができます。モデルFirebaseリアルタイムデータベース(JSONスキーマ)

私の質問:キーがIDであるJSONスキーマでキーと値のペアをモデル化するにはどうすればよいですか?

例:(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として使用されます。この参照(グループオブジェクト)とグループオブジェクト自体では、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

提供したJSON構造にはkey:valueのペアがあります。あなたは「火の柱の中の共通点」の意味を詳しく説明できますか?私はあなたの質問に答えるのに役立つかもしれません。 – Jay

+0

普通のJSONではリストを配列として整理します: '' groups ':{{' id ':1、' name ':' alpha '、...}、{' id ':2、' name ':' charlie '、...}] '。ファイヤーベースでは、配列はありません。 '' group1 ':{' name ':' alpha '、...}、' group2 ':{' name ':' charlie '、...}}リストを整理することをお勧めします。 '。 (上記参照) – Simon

+0

Firebaseには確かに配列があります。しかし、JSONストアの一般的なことは、配列の個々のコンポーネントが直接アクセスできない可能性があり、キー:値のペアと自動生成されたIDを活用する方がずっと柔軟性があるためです。 – Jay

答えて

0

はFirebaseにおける配列は確かにありますが、彼らは状況ですとすべき特定のユースケースでのみ使用し、一般的に避けるべきです。

あなたが投稿したFirebase構造は非常に一般的で、あなたの構造にkey:valueのペアがありますので、質問は不明確ですが、私はそれを打ち明けます。

'groups'は親キーで、値はgroup1:value、group2:valueの子キー:値のペアです。

リストされたgroup1、group2のキーは、配列ではないことを除けば、最初の例にリストされているIDと本質的に同じです。つまり、配列は連続したハードコード化インデックス(0番目、1番目、2番目など)を持っていますが、firebaseのキーはオープンエンドで、一般的に任意の英数字の値に設定できます。特定の順序(私はここで一般的に話している)

Firebase構造では、それらのキーはid0、id1、id2 ...またはa、b、c ...またはタイムスタンプ...またはauto-生成されたFirebase ID(childByAutoId)も '順次'にします。

しかし、あなたは

id0 
id1 
id2 
. 
id9 
id10 
id11 

ID1など、トラブルID0を使用して独自の割り当てに得ることができ、ここで現実には、実際の順序は

id0 
id1 
id10 
id11 
id2 

「キー」のことであるだろうということですキーを使用して順番にデータを読み取っている場合は、それをそのまま設定します。また、childByAutoId(言語仕様についてはdocsを参照)でキーを生成し、timestampやindexなどの子値の1つをorderByとして考えることもできます。

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

上記の場合、私は注文することができます。名前、インデックス、タイムスタンプ。

名前とインデックスは、記載されている順序でノードを読み取ります。タイムスタンプで注文すると、最初にチャーリーノードが読み込まれます。 orderByに子の値を利用することは非常に柔軟です。

また、startingAtとendingAtを使用してロードするデータセットを制限できます。たとえば、ノード10からノード14までのノードをロードしたいとします。非配列のJSONデータを簡単に処理できますが、配列全体を読み込む必要があるため、配列に格納されている場合は簡単に処理できません。

+0

私の質問が混乱していたように見えます。私はちょうどそれを編集しました。私はあなたのことを理解しています。しかし、私の質問は、主にJSONスキーマでこれらの構造を記述する方法についてですか? – Simon

関連する問題