我已经使用Firebase一段时间了,就像他们建议保持数据非规范化一样。我唯一的问题是找出跨多个集合查询的最佳方法。例如,我有一个Identity对象,用于保存用户的信息:
identities: {
$identity: {
name: string,
studio: $studioID
}}
这对应于Studio对象:
studios: {
$studio: {
name: string,
owner: $identityID,
location: $locationID
}}
此对象引用所有者及其位置。 location对象引用Classes,它引用Students .... on和on。现在,为了获取引用的对象,我正在做这样的事情:
Auth.loginUser(email, password, (success) => {
const identityRef = firebase.database().ref('/identity');
identityRef.child(success.uid).on("value", function(identitySnapshot) {
const identity = identitySnapshot.val();
const studioRef = firebase.database().ref('/studios');
dispatch({type: 'UPDATE_IDENTITY', identity})
studioRef.child(identity.studioID).on("value", function(studioSnapshot) {
const studio = studioSnapshot.val();
dispatch({type: 'UPDATE_STUDIO', studio});
})}); });
我会继续为位置,课程,学生等打电话。是否有更好的方法可以做到这一点?
答案 0 :(得分:0)
考虑以下结构:
identities: {
$identityKey: {
name: string
}
}
identities_studios: {
$identityKey: {
$studioKey: {
name: string
}
}
}
identities_studios_locations: {
$identityKey: {
$studioKey: {
$locationKey: {
lat: string,
lng: string
}
}
}
}
第一个identities
仅像往常一样存储有关身份的信息。
第二个identities_studios
仅存储有关工作室的信息,但工作室按$identityKey
分组。
第三个identities_studios_locations
仅存储有关位置的信息,但首先按$studioKey
分组,然后按$identityKey
分组。
现在你可以这样做:
const db = firebase.database()
Auth.loginUser(email, password, success => {
db.ref(`/identities/${success.uid}`).on("value", snap => { ... }
db.ref(`/identities_studios/${success.uid}`).on("value", snap => { ... }
db.ref(`/identities_studios_locations/${success.uid}`).on("value", snap => { ... }
}
我们不是一个接一个地发出多个请求,而是让它们同时运行。
如果你想在从数据库中获取所有这些信息之后,你可以将数据结构转换为你想要的任何东西:一个用于身份的数组,另一个用于工作室,另一个用于位置等;或者是具有嵌套工作室的单个身份数组,而这些工作室又具有嵌套位置等。