這次的實驗是想要model一個directed graph,也就是傳統的有向圖,希望之後能在上面做traversal的動作。
假設每個節點都有一個ID,一開始的想法是從relational database schema出發,很自然的是用每一個row代表一個邊,所以每個邊有兩個column (fromID, toID),而primary key是一個ordered composite key,即fromID + toID。不過因為沒有簡單的方法可以指定composite key,所以key的建構變得有點不直接,得由使用者來產生。
@PersistenceCapable
public class Edge {
@Primary
@Persistent
private String key; // invariant: fromID + toID
@Persistent
private String fromID;
@Persistent
private String toID;
}後來有看到有KeyBuilder可以來建立Entity Group的Key,不過不知道是否有可以建立composite key的方法。後來發現其實persistent property可以是一個collection,所以很直覺的有了下面第二種modeling。就是把同樣起點的edge都存在同一個object中。
@PersistenceCapable
public class Edge {
@Primary
@Persistent
private String key; // only for fromID
@Persistent
private String fromID;
@Persistent
private LinkedList<String> toIDs;
} 繼續閱讀tutorial後發現這樣會是一個owned one-to-many relationship,這麼一來如果每個node還有其他的properties,就會被迫被存很多次,一旦需要更新或是修改都會是大工夫。主要的原因就是node並不是只能被一個edge own,可能很多edge都連到同一個點。所以其實需要的關係是一種unowned one-to-many relationship。實作的方法則是在collection內不直接擺放node,而是要擺放key當reference用就好了。
@PersistenceCapable
public class Edge {
@Primary
@Persistent
private String key; // only for fromID
@Persistent
private String fromID;
@Persistent
private LinkedList<Key> toIDs;
} 當需要traverse這個graph的時候,要先拿出toIDs的Key,再去query對應的node出來。
在tutorial中也提到了各式各樣的relationship和entity group的概念,特別是entity group的概念會影響到資料儲存的位置與transaction執行的方式,有空再來詳細了解一下。
Hello 站長您好
ReplyDelete想問一下JDO處理GAE datastore物件的時候,是不是以物件的角度來處理呢?如果想刪除某一列的資料的時候,是不是刪除某物件就可以刪除那一列資料呢?