2015-07-20 71 views
6

我在下面發現了一些討論此場景的線索。Firebase:在單筆交易中更新多個對象

但是仍然在努力尋找,如果有任何建議的數據結構設計這一點。 我看到一個多寫庫firebase-multi-write其中說你可能不需要在大多數情況下。

但是我覺得我需要這個,我的方案是:3個用戶

/users/A : {credit:20} 

/users/B : {credit:3} 

/users/C : {credit:10} 

而且每個用戶可以相互都在同一時間偷學分,

  • 一來自B學分的搶斷看起來像{21,2}
  • B從C學分的搶斷看起來像{3,9}
  • 來自A學分的C搶斷看起來像{11,2 0}

現在我需要更新每個用戶的信用來保持這種一致性,以便每個竊取操作本質上是原子性的。

什麼是最好的方式來處理這種情況,同時保持數據的完整性Java

+1

你的第一個連接線程會談有關的另一種方法(事件採購 - http://martinfowler.com/eaaDev/ EventSourcing.html)。您會編寫一個捕獲所有三個盜竊事件的事件,然後當您需要查找當前的貸方餘額時,您可以加載初始狀態(可能爲0個貸記),然後播放事件歷史記錄,直到最終狀態結束。積分 - 你有所有「搶斷」的歷史。有沒有理由不接受? –

+0

謝謝,我提到的場景是我設想的工作流程的簡化版本。這是簡單的遊戲應用程序的一部分,其中A搶斷形式B,並在下一刻B搶斷它與C和D球員的混合。所以它對於一個簡單的原子更新只是太多的計算? – duskandawn

+0

我不知道你的場景是否知道原子操作是否會起作用 - 但是你描述的對我來說聽起來不像是原子操作。如果A從B拿走然後「在下一個時刻」B將其偷回......那不是原子的。這是發生在彼此附近的兩種截然不同的操作。 –

回答

3

2015年9月,Firebase開發者發佈了new version

在這個版本中,你現在可以做到這一點在單個原子更新這兩個位置:

Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); 
// Generate a new push ID for the new post 

Firebase newPostRef = ref.child("posts").push(); 
String newPostKey = newPostRef.getKey(); 

// Create the data we want to update 
Map newPost = new HashMap(); 
newPost.put("title", "New Post"); 
newPost.put("content", "Here is my new post!"); 

Map updatedUserData = new HashMap(); 
updatedUserData.put("users/posts/" + newPostKey, true); 
updatedUserData.put("posts/" + newPostKey, newPost); 

// Do a deep-path update 
ref.updateChildren(updatedUserData, new Firebase.CompletionListener() { 
    @Override 
    public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
     if (firebaseError != null) { 
      System.out.println("Error updating data: " + firebaseError.getMessage()); 
     } 
    } 
});