2012-08-07 52 views
5

在高度複製數據存儲(我正在使用NDB)中,一致性是最終的。爲了獲得保證的完整集合,可以使用祖先查詢。祖先查詢還提供了一種很好的方式,讓一個特定祖先的所有「孩子」都得到無情的詢問。總之,能夠利用祖先模型在GAE中非常有用。如何更改NDB記錄的祖先?

我似乎擁有的問題相當簡單。假設我有聯繫人記錄和消息記錄。給定的聯繫人記錄正被視爲每封郵件的祖先。但是,可能會爲同一個人創建兩個聯繫人(用戶錯誤,不同的數據點等等)。這種情況會產生兩個聯繫人記錄,其中包含與他們有關的消息。

我需要能夠「合併」這兩個記錄,並把所有的信息放到一大堆。理想情況下,我可以修改唱片的一個孩子的祖先。

我能想到做到這一點的唯一方法是創建一個映射並使我的應用程序檢查是否合併了記錄。如果有,請查看映射以查找一個或多個相關記錄,並針對這些記錄執行查詢。這看起來效率很低。是否有更多的「通過本書」處理這個用例的方式?

+0

對我來說,這聽起來像取決於你的數據模型的樣子。你如何確定2條記錄是否需要合併? – aschmid00 2012-08-07 21:24:19

+0

好問題 - 因爲這是一個思考階段,讓我們假設用戶輸入。 – Sologoub 2012-08-07 21:28:18

+0

所以如果你想基於userinput的特定字段進行合併(可以說是郵件),那麼你首先查詢數據存儲,然後查看帶有該電子郵件的記錄是否已經存在並從那裏繼續。如果應用程序是新的,並且您沒有記錄,那麼我建議您使用基於電子郵件的鍵名/ ID創建記錄,以便能夠通過ID查詢。 – aschmid00 2012-08-07 21:32:28

回答

9

更改實體的祖先的唯一方法是刪除舊實體並使用新密鑰創建一個新實體。這必須爲祖先路徑中的所有小孩(和大孩子等)實體完成。如果這是不可能的,那麼你列出的解決方案的作品。

這是必需的,因爲實體的祖先路徑是其唯一鍵的一部分。實體的父母(即祖先路徑中的實體)不需要存在,因此,更改父母的密鑰會將孩子留在沒有父母的數據存儲中。

+0

謝謝。我希望提供更有效的解決方案,但這非常合理。 – Sologoub 2012-08-07 22:52:04