我会试一试...
首先,Firebase 不是关系数据库,因此不应以这些术语来考虑它。但是,您可以在(对于最终用户)感觉“相关”的数据之间建立“关系”
让我们使用类似部门和员工的示例。一个部门可以有很多员工,而这些员工属于该部门。
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 中的 push() 或 ChildByAutoId (objc) 生成
同样,如果我们知道机组成员的姓名(Bones),我们可以查询该特定节点以返回他属于 dept_02(医疗)。
如果 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 很沮丧),而 cramp_04 (Spock) 现在在桥梁和工程部门。使用这个添加的belong_to 节点,in_dept 子节点可以从crew 节点中移除。
应该包括一对一、一对多和多对多