Javascript 在Firebase中查询多个集合

Javascript 在Firebase中查询多个集合,javascript,firebase,firebase-realtime-database,nosql,Javascript,Firebase,Firebase Realtime Database,Nosql,我与Firebase合作了一段时间,我喜欢他们关于保持数据非规范化的建议。我唯一的问题是找出跨多个集合查询的最佳方法。例如,我有一个Identity对象,它保存我的用户信息: identities: { $identity: { name: string, studio: $studioID }} 对应于Studio对象的: studios: { $studio: { name: string, owner: $identityID, locat

我与Firebase合作了一段时间,我喜欢他们关于保持数据非规范化的建议。我唯一的问题是找出跨多个集合查询的最佳方法。例如,我有一个Identity对象,它保存我的用户信息:

identities: {
  $identity: {
    name: string,
    studio: $studioID
}}
对应于Studio对象的:

studios: {
  $studio: {
    name: string,
    owner: $identityID,
    location: $locationID
}}
此对象引用所有者及其位置。location对象引用类,类引用学生。。。。不断地。现在,为了获取引用对象,我正在执行以下操作:

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});
    })}); });

我会继续为地点、班级、学生等打电话。有更好的方法吗?

考虑以下结构:

identities: {
    $identityKey: {
        name: string
    }
}

identities_studios: {
    $identityKey: {
        $studioKey: {
            name: string
        }
    }
}

identities_studios_locations: {
    $identityKey: {
        $studioKey: {
            $locationKey: {
                lat: string,
                lng: string
            }
        }
    }
}
第一个,
标识
,通常只存储有关标识的信息

第二个,
identifications\u studios
,只存储有关工作室的信息,但工作室按
$identityKey
分组

第三个,
identifications\u studiou\u 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 => { ... }
}
我们让它们同时运行,而不是一个接一个地发出多个请求


如果您愿意,在从数据库获取所有这些信息后,您可以将数据结构转换为您想要的任何内容:一个用于标识的数组,另一个用于工作室,另一个用于位置,等等。;或者一组带有嵌套工作室的身份,这些工作室又有嵌套的位置等。

感谢您花时间回复!我唯一的问题是,我的数据仍然被捆绑在一起,即使它在不同的“集合”中。既然所有东西都绑定到特定的uid,我如何与多个用户共享相同的数据?我之所以把东西分成不同的集合,是为了让它对多个实体可用。