【发布时间】:2017-12-13 12:46:42
【问题描述】:
我正在构建一个运动管理器应用程序,让用户可以创建自己的比赛并更新比赛结果以供其他参与者参考。
我阅读了很多关于数据库平坦度的文章(我来自 SQL :-),并看到了 Firebase 团队的许多视频教程。
此时我有这样的结构:
{sport-manager :
...
groups : {
"groupId1" : {
competitionId : "competitionId1"
name : "Group A",
type : "LEAGUE"
},
"groupId2" : {
competitionId : "competitionId1"
name : "West playoofs",
type : "PLAYOFFS"
},
...
},
players : {
"playerId1" : {
birthday : 351408600000,
firsName : "Jhon",
lastName : "Doe",
shirtNumber : 0,
teamId : "teamId1"
},
...
},
teams : {
"teamId1" : {
competitionId : "competitionId1"
name : "Team 1",
},
...
},
teamGroupStats : {
"groupId1" : {
"teamId1" : {
goalsAgainst: 0,
goalsFavor: 0,
matchesDraw: 0,
matchesLoss: 0,
matchesPlayed: 0,
matchesWin: 0,
points: 0,
teamName: "Team 1",
},
"teamId2" : {
...
},
...
},
"groupId2" : {
"teamId2" : {
...
},
...
}
...
}
}
这种结构让我可以查询以通过这种方式使用属于组的所有团队的数据填充 ListView 适配器:
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
Query groupQuery = mDatabase.child("teamGroupStats").child("groupId1")
或者当我必须从确定的球队中获得球员时:
Query playersQuery = mDatabase.child("players").orderByChild("teamId").equalTo("teamId1");
到目前为止,一切都很好。当我必须从这个结构中删除一个团队时,我的问题就来了。为了避免完整性问题,我使用多路径更新来全部删除。
- 一支球队可以有一名或多名球员
- 团队可以是一个或多个组的一部分。
考虑到这一点,我可以删除包含他所有球员的任何球队。
Map<String, Object> deleteMap = new HashMap<>();
deleteMap.put("teams/teamId1", null);
Query playersQuery = mDatabase.child("players").orderByChild("teamId").equalTo("teamId1");
playersQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot playerSnapshot : dataSnapshot.getChildren()){
deleteMap.put("players/" + playerSnapshot.getKey(), null);
}
// Delete all in one call!
mDatabase.updateChildren(deleteMap);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
如何进行查询以获取具有“teamId1”的所有路径在结构“teamGroupStats”中具有辅助键? 他这个结构好用吗?
【问题讨论】:
标签: android firebase firebase-realtime-database nosql