これを狙ってみます…
何よりもまず、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 対多、多対多をカバーする必要があります。