2012-10-08 130 views
0

自從幾天以來,我正在使用App Engine。對我來說最重要的是對數據進行建模,所以我對此有一些疑問。 假設我有簡單的MyUser類。我有Buddy類以及它看起來像這樣:App Engine數據存儲 - 數據模型

@Entity 
public class Buddy { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Key id; 
    private Date createAt; 
    private MyUser user; 
    private Key buddyOf; 
} 

在這個類我有MyUser領域,因爲每一個哥們是一個用戶,我有buddyOf場,因爲是有他的好友列表上的這個哥們另一個MYUSER。 問題是如果我從Datastore獲得一個樣本夥伴,我也會得到這個MyUser?如果是,什麼時候在MyUser類將被嵌入另一個Entity和那Entity多一個,等等...?也許我應該只堅持Key字段給其他實體? 主要問題是我應該如何將數據存儲在數據存儲中?我應該使用構圖並在其他對象內部有對象?如果是的話,對象中的物體等等...... 什麼是最好的方法?

回答

1

DataStore對象模型設計應該與通常用於關係數據庫的設計不同。您應該檢查屬性的支持類型https://developers.google.com/appengine/docs/java/datastore/entities#Properties_and_Value_Types沒有對象作爲屬性類型。您仍然可以使用嵌入註釋,但它不是您的案例的最佳方式。

您應該存儲用戶的密鑰甚至ID作爲參考。它會縮小實例並解決您描述的問題。但是你將無法達到參考完整性。這是NoSQL設計的限制。

1

我想你是建模一個n:m的關係。可以創建這樣的結構:

  • 對於每個MYUSER實體,它有一組具有元素類型好友實體(基,表示本MYUSER實體的所有好友)的。
  • 每個Buddy實體都有MyUser實體作爲其祖先。
  • 每個好友實體代表所有者MYUSER和另一個MYUSER對象之間的關係,通過含有一個字段:其他MYUSER的id

所以下面的操作變得容易和自然與數據存儲:

  • 添加/刪除好友的MYUSER實體(只需添加/刪除新的子好友實體)
  • 查詢所有好友的MYUSER實體(列表中的所有兒童)

這個結構對於gae-datastore high replaca有幾個好處。例如,如果您將好友(子實體)添加到MyUser實體,則可以立即查詢它們,因爲它們位於同一個實體組中(您總是可以毫不拖延地看到一致的數據)。

相關問題