【发布时间】:2020-04-15 18:56:23
【问题描述】:
我的应用中有两个实体 - User 和 Shift。它们共享多对多关系。
这就是我使用非规范化技术和 4 个顶级节点构建数据库的方式:
{
"shift-assign":{
"-Lwo52vuW9QqCmAfS90w":{
"111":{
"email":"john@gmail.com",
"firstName":"John",
"id":"111",
"lastName":"Smith",
"password":"111",
"phone":"555",
"wage":30.0
},
"222":{
"email":"jane@gmail.com",
"firstName":"Jane",
"id":"222",
"lastName":"Doe",
"password":"222",
"phone":"678",
"wage":32.5
}
},
"-Lwsj8yE6HW2IUoTVJ0G":{
"111":{
"email":"john@gmail.com",
"firstName":"John",
"id":"111",
"lastName":"Smith",
"password":"111",
"phone":"555",
"wage":30.0
}
}
},
"shifts":{
"-Lwo52vuW9QqCmAfS90w":{
"date":"20191224",
"endTime":"12:00",
"key":"-Lwo52vuW9QqCmAfS90w",
"startTime":"10:00"
},
"-Lwsj8yE6HW2IUoTVJ0G":{
"date":"20191224",
"endTime":"14:00",
"key":"-Lwsj8yE6HW2IUoTVJ0G",
"startTime":"11:00"
}
},
"user-assign":{
"111":{
"-Lwo52vuW9QqCmAfS90w":{
"date":"20191224",
"endTime":"12:00",
"key":"-Lwo52vuW9QqCmAfS90w",
"startTime":"10:00"
},
"-Lwsj8yE6HW2IUoTVJ0G":{
"date":"20191224",
"endTime":"14:00",
"key":"-Lwsj8yE6HW2IUoTVJ0G",
"startTime":"11:00"
}
},
"222":{
"-Lwo52vuW9QqCmAfS90w":{
"date":"20191224",
"endTime":"12:00",
"key":"-Lwo52vuW9QqCmAfS90w",
"startTime":"10:00"
}
}
},
"users":{
"99999":{
"email":"",
"firstName":"Admin",
"id":"99999",
"lastName":"",
"password":"111",
"phone":"",
"wage":0
},
"111":{
"email":"john@gmail.com",
"firstName":"John",
"id":"111",
"lastName":"Smith",
"password":"111",
"phone":"555",
"wage":30.0
},
"222":{
"email":"jane@gmail.com",
"firstName":"Jane",
"id":"222",
"lastName":"Doe",
"password":"222",
"phone":"678",
"wage":32.5
}
}
}
我可以插入、读取和删除 User 、 Shift 对象,但是在更新它们时,事情变得有点复杂。
例如,如果我想更新用户的工资,我必须遍历分配给用户的所有班次(在 user-assign/$id 下),存储所有班次的键,然后参考 shift-assign/$shift-key每个存储的密钥并更新工资。
这将需要嵌套的EventListener,这是我试图避免的。
显然更新Shift 节点也会出现同样的问题。
有没有更好的方法来解决这个问题?
【问题讨论】:
-
如果用户的所有班次都在
user-assign/111之下,则需要一个侦听器来读取它们。如果您编辑问题以显示您尝试过的内容,这可能会有所帮助。
标签: android firebase firebase-realtime-database nosql