0

我很難爲Firebase獲取我的數據並需要一些指導。我對關係數據庫很有信心,並發現我只是將這種思維方式複製到Firebase。Firebase數據:denormilization和複製

我正在創建一個健身應用程序。我擁有的結構如下:練習,鍛鍊和程序。

練習很簡單,它是一個名稱,描述和簡單運動的照片,像蹲或benchpressing。

exercise 
--e1 
    --name:"Squats" 
    --description: "..." 
--e2 
    --name:"Benchpress" 
    --description: "..." 

然後我有一個鍛鍊列表。鍛鍊是一組按照特定順序與特定代表和組合執行的練習。一個鍛鍊可以與不同的參數(代表,臺,休息)

workouts 
--w1 
    --name:"Easy workout" 
    --description: "Design for beginners" 
    --exercises: 
    --we1: 
     --exercise: e1   
     --reps: 12 
     --rest: 60 
     --order: 1 
    --we2 
     --exercise: e2 
     --reps:6 
     --rest: 30 
     --order: 2 
--w2 
    --name: "Hard exercise" 
    ... 

所以在這裏我有W1很多鍛鍊使用,只是用鍛鍊1鍛鍊:首先你進行鍛鍊1,每組12次,然後休息60秒,然後6次鍛鍊2,休息30秒。

最後我有一個程序/計劃。一個程序由多個鍛鍊組成,您可以遵循。例如,您的程序可能包含3個星期一,星期三和星期五的鍛鍊。

programs 
--p1 
    --name: "The Stack Overflow Fitness Plan" 
    --description: "I am a fancy text" 
    --workouts: 
    --w1: true 
    --w2: true 

因此,如上所述,我只是將關係數據放在firebase中。這不是正確的方法。我只是遇到麻煩,我應該如何以平坦的方式來處理這些數據。重複例如好嗎?

目前,我有一個非常昂貴的書(不是最好的做法),因爲我查詢的程序位置,將其映射,查詢鍛鍊,它映射,查詢練習。它變得非常麻煩很快。

任何的幾點思考和幫助是極大的讚賞。

回答

0

你可以看看到normalizr庫。它最初設計用於幫助處理其他API和Reduce:在非關係環境中出現重複的相同問題。

基本上我會做的是讓每個不同類型的存儲在一個火力點地圖的實體。

const tree = { 
    exercises: { 1: { name: ... }, ... }, 
    workouts: { 1: ... }, 
    programs: { 1: ... }, 
} 

然後,您可以讓每個組件都訂閱其相應的實體。有了承諾和/或流,它是相當直接的。

每一個你的關係是簡單地在數組中的ID,您可以使用normalizr庫規範化/反規範化當你想讀在db /寫。

請注意,這個模式就可以方便地使用火力update API一次使用的查詢,如更新幾個實體:

const updateQuery = { 
    "workouts/id": ..., 
    "exercises/id": ..., 
    "programs/id": ..., 
}