0

Firebase のデータ構造として、何かお役に立てれば幸いです。API ガイドと次のようなブログ記事を読みました。

  1. クエリ、パート 1: Firebase 用に変換された一般的な SQL クエリ
  2. Firebase: より多くのクエリを実行できるようになりました!
  3. データの非正規化は正常です

私は SQL (具体的には MySQL と SQLite) を離れ、Firebas に移行しようとしています。Firebase で構造化された JSON のこれらのテーブルと関係を構造化する方法を知りたいです。関係 1-1; 1 - N; N - N; いくつかのリレーションシップを含むサンプル データベースの写真を送信しています。データベースでこのように表示されることをサポートしてもらえますか? SQL でクエリを実行するのと同じように、データを参照する必要があることを思い出してください。

これは私のデータベースです: 無視してください

4

1 に答える 1

2

これを狙ってみます…

何よりもまず、Firebase はリレーショナル データベースではないため、そのように考えるべきではありません。ただし、(エンド ユーザーにとって) 「リレーショナル」と感じるデータ間の「関係」を作成することはできます。

Departments と Employees のような例を使用してみましょう。部門には多くの従業員を配置でき、それらの従業員はその部門に属します。

departments
  dept_00
    dept_name: "Bridge"
  dept_01
    dept_name: "Engineering"
  dept_02
    dept_name: "Medical"

crew
 crew_00
  crew_name: "Kirk"
  in_dept: "dept_00"
 crew_01
  crew_name: "Scotty"
  in_dept: "dept_01"
 crew_02
  crew_name: "Bones"
  in_dept: "dept_02"
 crew_04
  crew_name: "Spock"
  in_dept: "dept_00"

この構造では、ブリッジ メンバーである乗組員に対してクエリを実行できます。これは ObjC スニピットです。

Firebase *ref = [myRootRef childByAppendingPath:@"crew"];
FQuery *q1 = [ref queryOrderedByChild:@"in_dept"];
FQuery *q2 = [q1 queryEqualToValue:@"dept_00"];

[q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
  NSLog(@"%@", snapshot.value);
}];

これにより、crew_00 (Kirk) ノードとcrew_04 (Spock) ノードが返されます。

データ (Bridge、Engineering) とノード名 (dept_00、dept 01) の間の関連付けが解除されていることに注意してください。これにより、データ間の「リンク」を壊さずにデータを変更できます。したがって、'Engineering' を 'Scotty's Hideaway' に変更すると、すべてが機能し続けます。これらの「ランダムな」ノード名は、firebase または ChildByAutoId (objc) の push() によって生成されます。

同様に、乗組員の名前 (Bones) がわかっている場合は、その特定のノードをクエリして、dept_02 (Medical) に属していることを返すことができます。

たとえば、Spock と Bones が複数の異なる部門 (Bridge と Engineering など) に属している場合は、乗組員が属する部門を追跡する別のノードを追加することで、これを拡張できます。

belongs_to
  crew_02
   dept_00: true
   dept_02: true
  crew_04
   dept_00: true
   dept_01: true

ここで、crew_02 (Bones) は現在、医療部門と橋梁部門に所属しており (Spocks はがっかりしています)、crew_04 (Spock) は現在、橋梁および技術部門に所属しています。この属しているノードを追加すると、in_dept 子ノードを乗組員ノードから削除できます。

1 対 1、1 対多、多対多をカバーする必要があります。

于 2015-10-08T18:17:19.987 に答える