這個想法是設計一個包含一些基本信息的表/實體,以及一個Markdown-Content字段,它允許用戶輕鬆創建表格等。爲用戶可以編輯的頁面設計數據存儲架構(例如維基百科/ stackoverflow頁面)
我想是這樣的:
type Tournament struct {
ID in64 `datastore:"-"`
MDContent []byte `datastore:",noindex"`
Name string
URL string
DateCreated int64
CreatedBy string
DateUpdated int64
UpdatedBy string
ApprovalStatus int64 // 0=to be decided, 1=approved, 2=rejected, 3=discontinued
ApprovalBy string
}
我的問題是搞清楚如何來更新它。 ID字段也將被用作URL路徑,例如,如果一個實體擁有ID 7,那麼它將顯示在example.com/tournament/7上。
我相信這消除了簡單地用更新的數據創建新實體的可能性,然後在前一個實體上設置ApprovalStatus = 3,因爲如果您這樣做,則example.com/tournament/7 URL將不會更長的請求正確的ID。我也不喜歡創建我自己的唯一ID的想法,因爲我認爲簡單地利用數據存儲ID生成(這也使得基於URL的正確實體變得容易)是很好的;我考慮創建一個新的實體/表格來跟蹤修訂版本,但我不確定這些修改的效率如何,所以我希望有些專家可以提供一些建議。
更新有關@mkopriva解決方案:
如果你做這種方式,那麼它必須包括TournamentEdit實體結構,我認爲裏面TournamentID場?
type TournamentEdit struct {
ID in64 `datastore:"-"`
TournamentID int64
MDContent []byte `datastore:",noindex"`
DateCreated int64
CreatedBy string
ApprovalStatus int64 // 0=to be decided, 1=approved, 2=rejected, 3=discontinued
ApprovalBy string
}
然後檢索功能看起來是這樣的:
func (db *datastoreDB) GetTournamentByKeyID(ctx context.Context, keyID int64) (*Tournament, error) {
key := datastore.IDKey("Tournament", keyID, nil)
var tournamnet Tournament
err := db.client.Get(ctx, key, &tournament)
// err checking
tournament.ID = key.ID
var edits TournamentEdits
query := datastore.NewQuery("TournamentEdit")
query = query.Filter("TournamentID =", tournament.ID)
query = query.Filter("ApprovalStatus =", 1)
if _, err := db.client.GetAll(ctx, query, &edits); err != nil {
//err checking
}
tournament.Edits = edits // I guess this is wrong way to do it?
return &tournament, nil
}
將這項工作?
你能看看更新的問題嗎?我認爲你的意思是可以這樣做?在這種情況下,那麼可能只有1個實體的ApprovalStatus = 1,因爲先前批准的實體將被設置爲停用(ApprovalStatus = 3) – fisker
就TournamentID而言,這就是我在使用關係時像'postgres'這樣的數據庫,但我真的不知道應該如何用Go來模擬gae的'datastore'中的關係......但是如果你的更新的例子適合你,那麼這可能是*應該怎麼做。關於「狀態」,在批准新的批准後停止上次批准的編輯對我來說很有意義。 – mkopriva
太棒了,再次感謝很多:) – fisker