1

我建模一個谷歌的數據存儲與客觀化和部分數據存儲區的有以下3個要素:物化POST/LIKE /用戶關係

User post new Post which can be liked by many Users

用戶發佈一個新帖子可以被很多用戶喜歡(典型的社交網絡)。

到目前爲止,我有用戶:

@Entity 
public class UserMW { 

    @Id 
    private Long id; 

    @Index 
    private String email; 

    ... 
} 

帖子:

@Entity 
public class PostMW{ 

    @Id 
    private Long id; 

    @Load 
    private Ref<UserMW> owner; 

    ... 
} 

,喜歡:

@Entity 
public class LikeMW { 

    @Id 
    private Long id; 

    @Load 
    private Ref<UserMW> user; 

    private Key likedObject; 

    ... 
} 

它完美,滿足我所有的需求至今。現在的問題是,我不知道我應該去哪一種方式,而不是像一個帖子(從類似的喜歡中刪除一個實體)。

我有用戶和likedObject鍵將其刪除,所以如果它是在一個關係型數據庫是很簡單的,但是,客觀化...

(只是用「那裏」的用戶ID和likedObjectID刪除)

我可以考慮兩種方法:

1 - @index關於這兩個屬性的喜歡實體然後查詢它並刪除(但@Index是如此昂貴,表喜歡是巨人!!聽起來不是一個好東西想法)

2 - @Parent關於用戶屬性的喜歡實體和@Index關於對象然後由祖先查詢,然後過濾byObjectObject Key an D刪除(但如果我使用@Parent,我明白所有的時間我加載1個用戶,我會加載他所有的喜歡,正如我所說,表喜歡是巨大的!聽起來不是一個好主意)

任何建議來解決我的問題?

謝謝你們!

+0

聽起來像爲'Like'模型添加一個索引是要走的路...至於費用昂貴 - 索引現在是免費的(但索引存儲不是)。是什麼讓你覺得它會讓喜歡 - 巨人? –

+0

原因喜歡是要存儲整個應用程序的所有喜歡。目前它的實現是用來存儲喜歡的帖子,但很快我們就會添加這個功能,讓用戶能夠喜歡圖片,評論,帖子等......就像facebook一樣。所以喜歡會有這麼多的實體。 索引價格昂貴,因爲GAE數據存儲會向您收取書面費用,並且每個實體內的每個索引都會被寫入兩次。 我對嗎@MihailRussu? –

+1

根據[數據存儲的新定價](https://cloudplatform.googleblog.com/2016/03/Google-Cloud-Datastore-simplifies-pricing-cuts-cost-dramatically-for-most-use-cases.html)'寫作無論指標如何,單個實體的成本只有1筆,現在每10萬美元的成本爲0.18美元。您可以使用盡可能多的索引來滿足您的應用程序需求,而不會增加寫入成本。「 索引仍然存儲並影響性能,但使用它們時可能會更加自由。我個人認爲你在做什麼是過早的優化和會與另一個索引,但我錯了...... :) –

回答

2

我會增加一個索引到Like實體去,因爲這是最簡單可行的解決方案,特別是考慮到datastore's newish pricing這也使得它便宜一點:

...寫一個單一的實體只加1無論指標如何, 現在的成本爲每10萬美元0.18美元。這意味着對於使用多個索引的人來說寫入更實惠 。您可以使用盡可能多的索引作爲您的應用程序需求,而不會增加寫入成本。

注意指標仍然需要存儲和可能影響性能,但是你可以使用它們時更寬鬆一點......

1

是的,你可以簡單的索引userlikedObject領域運行像查詢關係型數據庫。然而,這樣做有兩個缺點:

  • 的查詢是最終一致
  • 你不採取的內存緩存

強相合優點是可取的,這樣,如果用戶喜歡/ unlikes東西和重載該頁面,他們保證立即看到效果。

這裏是我會做:

@Entity 
@Cache 
public class Like { 
    @Parent 
    private Ref<User> user; 

    @Id 
    private String likedObjectKey; 

    public <T> Key<T> getLiked() { return Key.create(likedObjectKey); } 
} 

使用的東西toWebSafeString()鑰匙被人喜歡的字符串Like實體ID。您可以添加一些語法糖以隱藏字符串化/縮小字符串。

這意味着爲{用戶,事物}元組取得Like始終是一個按鍵操作。您可以批量提取它們,並且提取將利用memcache(正面和負面命中將被緩存)。結果將始終保持一致。您可以輕鬆獲取並修改這些交易。

請注意,這不會讓你問「誰喜歡這個東西?」這個問題。你也可以想要存儲在Like作爲一個正常索引字段的喜歡的對象的關鍵。即使您沒有立即計劃使用它,我也會強烈推薦它。即使只是爲了調試,您最終還是希望運行該查詢。每個人似乎都害怕,索引成本並不高。