2017-02-21 93 views
0

我一直在使用Firebase一段時間,並且喜歡他們建議保持數據非規範化。我唯一的問題是找出跨多個集合進行查詢的最佳方法。例如,我有持有我的用戶信息的身份對象:查詢Firebase中的多個集合

identities: { 
    $identity: { 
    name: string, 
    studio: $studioID 
}} 

對應於工作室對象:

studios: { 
    $studio: { 
    name: string, 
    owner: $identityID, 
    location: $locationID 
}} 

此對象引用的擁有者,也是他們的位置。位置對象引用了類,它引用了學生....等等。眼下,爲了獲取一個引用的對象,我在做這樣的事情:

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

考慮以下結構:

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 => { ... } 
} 

反而使得對方後多個請求之一,我們讓他們同時運行。

如果你想從數據庫獲得所有這些信息,你可以將數據結構轉換爲任何你想要的:一個數組用於身份,另一個用於工作室,另一個用於位置等。或嵌套工作室身份的單一陣列,而嵌套工作室又具有嵌套位置等。

+0

感謝您花時間回覆!我擁有的唯一問題是,即使數據處於不同的「集合」中,我的數據仍然束縛在一起。由於一切都綁定到特定的uid,我將如何與多個用戶共享相同的數據?我把事情分解成不同集合的原因是讓它可以被多個實體使用。 – Dabellator