2017-09-14 31 views
0

Db的結構的缺失:刪除用戶帳戶觸發另一節點

--followers 
    -followedUser1 
    -user1 
    -followedUser2 
    -user1 
    -user2 
--users 
    -user1 
    -followed 
    -followedUser1 
    -followedUser2 
    -user2(followedUser1) 
    -followed 
    -followedUser2 
    -user3(followedUser2) 

每次用戶如下(的onCreate)& unfollows(onDelete)下的追隨者/ {followedUser}/{followerUser}路徑,它觸發功能,其增加或並且從追隨者分配或分離職位。它通過扇出方法工作,並沒有問題。現在,更糟糕的部分是當一些用戶完全刪除賬戶並將他的追隨者從他自己中刪除(因爲他的賬戶將是一個幽靈),我已經設置觸發器onDelete來指示它什麼時候會發生,然後遍歷該用戶的(ieuser3 )的追隨者刪除自己從相應的追隨者以及他的帳戶,它看起來像這樣,那麼:

--followers 
    -followedUser1 
    -user1 
    -followedUser2 
    -user1 
    -user2 
--users 
    -user1 
    -followed 
    -followedUser1 
    -user2(followedUser1) 

現在,問題的一部分 - 當承諾的回報,我想也刪除整個跟隨/ followedUser2(因爲它是一個鬼了)路徑,但...有一個觸發器,不幸的是爲(onDelete)下的每個追隨者執行。那麼,是否有機會刪除上面的路徑(levelup)刪除觸發器而不觸發子節點本身?或任何其他的辦法將是巨大的,感謝

編輯:不要誤會我的意思,它會工作,但如果followedUser下追隨者的數量將是「很多」服務器將100後死去......觸發

回答

3

此時,無法過濾哪些刪除事件會觸發該功能,因此您是正確的,該功能將針對被刪除用戶所關注的每個用戶觸發一次。我認識到這是許多使用此類功能的用例之一,因此如果您有機會,請填寫功能請求here

1

它看起來像你的多重更新問題可以固定一個multi-location updates

在非常迅速地砍死在一起,並沒有測試打字稿:

export const cleanupFollowers = functions.auth.user().onDelete(event => { 
    const user = event.data.userId; 
    const followersNode = admin.database().ref(`followers/${user}`); 
    const followers = _.keys(await followersNode.once('value')); 

    // Every follower also has a reverse node for this user. Get the list of keys: 
    const reverseNodesToDelete = followers.map(follower => `followers/${follower}/${user}`); 
    // Model this update as a map of deep key -> null to delete all at once 
    let cleanup = _.keyBy(reverseNodesToDelete, null); 
    // add one more update: deleting full node for the deleted user. 
    cleanup[`followers/${user}`] = null; 

    // do all deletions as one database request: 
    return admin.database().ref().update(cleanup); 
} 

注意,這仍然會解僱你的計數功能,但這應該可以並行運行。這可能會讓您的應用程序更簡單,讓每個不變量單獨捕獲。

+0

此外,作爲參考,'_'是lodash模塊的常用變量名稱。這是一個非常棒的工具,可以幫助您編寫功能代碼來執行列表推導。這種編碼方式可以讓您編寫更多精簡的代碼,無需擔心逐個錯誤或邊界情況下的零個,一個和多個列表。 –

+0

謝謝,但這是我已經得到的。我想我可能不清楚我的問題。我的情況是,用戶有100000個追隨者,他想要刪除他的賬戶,現在我的計數和附加/分離郵件功能將激活10萬次,所以如果我將所有與該觸發器相關的東西都收集起來,並把它放在多位置更新像你必須使前一個觸發器停用,但這是我的問題:如何過濾,我正在刪除用戶帳戶與他的追隨者+數他們等,並防止(以某種方式)取消關注(onDelete)觸發器火 –

+0

我明白了。這是一個不同於我以爲的問題。在100K粉絲中,你會遇到另一個問題。數據庫在每次寫入1K事件時具有硬限制;如果超過這個數字,則不會觸發事件。您可以批量寫入或濫用此操作以更新計數(但要小心跨100K節點的事務幾乎肯定會失敗)。老實說,100K更新似乎有點奇怪的邊緣情況下,你花時間優化(只要它工作)。你真的期望用戶能夠獲得如此的知名度並經常離開嗎? –