2017-04-18 29 views
0

這個想法是設計一個包含一些基本信息的表/實體,以及一個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

你可以做的一件事是簡單地創建一個代表比賽的edit的新實體。順便說一句,我不是一個datastore用戶,所以我不知道這是你如何將實體模型,但總的想法是大多數一樣,如果不是所有的數據庫:

type Tournament struct { 
    ID   in64 `datastore:"-"` 
    MDContent []byte `datastore:",noindex"` 
    Name  string 
    URL   string 
    DateCreated int64 
    CreatedBy string 
    DateUpdated int64 
    UpdatedBy string 
    Edits  []TournamentEdit 
} 

type TournamentEdit struct { 
    ID    in64 `datastore:"-"` 
    MDContent  []byte `datastore:",noindex"` 
    DateCreated int64 
    CreatedBy  string 
    ApprovalStatus int64 // 0=to be decided, 1=approved, 2=rejected, 3=discontinued 
    ApprovalBy  string 
} 

這應該允許您對隊列中的不同用戶進行多次編輯,進行特定編輯,或按其狀態對其進行編輯。

+0

你能看看更新的問題嗎?我認爲你的意思是可以這樣做?在這種情況下,那麼可能只有1個實體的ApprovalStatus = 1,因爲先前批准的實體將被設置爲停用(ApprovalStatus = 3) – fisker

+0

就TournamentID而言,這就是我在使用關係時像'postgres'這樣的數據庫,但我真的不知道應該如何用Go來模擬gae的'datastore'中的關係......但是如果你的更新的例子適合你,那麼這可能是*應該怎麼做。關於「狀態」,在批准新的批准後停止上次批准的編輯對我來說很有意義。 – mkopriva

+0

太棒了,再次感謝很多:) – fisker

相關問題