2016-01-01 102 views
0

我使用app引擎和數據存儲。我有餐館和業主實體。 店主是父母餐廳。我在主網頁上顯示餐館列表。當訪客點擊餐廳時,會打開個人資料頁面(www .../restaurants /:id)。那時我沒有祖先鑰匙。我應該如何找回餐廳?我可以使用/ restaurants /:key但datastore.key是很長的字符串。 這樣做的自然方式是什麼?我應該使用獨特的餐廳名稱和查詢/過濾嗎?通過id/key獲取實體而不指定祖先密鑰

+1

爲什麼擁有者是祖先,請改用關係。即餐廳的owner = KeyProperty()。您是否在使用涉及所有者和餐館的交易組?通常情況下,人們會將祖先的財產用於擁有關係,然後遭受損失。例如,如果你的餐廳改變它的所有者,你必須重新與一個新的父母餐廳。如果你進入餐廳並不總是涉及業主,你有你的問題。您目前通過使用所有者作爲祖先得到什麼好處? –

+0

KeyProperty是Python中的一個術語嗎?我用Go。所以,我使用祖先,因爲當我刪除所有者時,我可能想刪除它下面的餐廳,然後刪除餐館下的菜單等。聽起來像我需要交易。我不知道如何聰明地做到這一點。 但是,你的意思是我在Restaurant下添加一個字符串字段並將其值設置爲Owner的鍵值?如果是這樣,我可以做到。 – nurp

+1

KeyProperty與go中的'Datastore key'相同。即使使用祖先,也不會發生級聯刪除。所以你必須執行一系列的查詢和刪除操作。是的,單一的交易可能是合適的,但你有XG交易,所以它沒有什麼大不了的。如果你不知道父母沒有查詢,而不是偶爾刪除一個所有者,是否值得將尋找餐館的最常見要求複雜化?那是你決定的事情。查看所有常用用例並設計數據模型以有效支持最常見的用例。 –

回答

1

您可以保留您當前的數據模型(餐館的所有者的子實體)。您只需要將「所有者」變量添加到餐館。

當您檢索餐館實體時,可以從其關鍵字中提取所有者ID - 每個關鍵字都已包含父關鍵字(如果有)。在Java中,它看起來是這樣的:

restaurant.setOwner(entity.getParent().getId()); 

當你需要獲取/保存餐廳的實體,您可以使用自己的標識和主密鑰,與主人ID創建打造全鍵。