2017-04-18 2 views
0

考えられるのは、いくつかの基本情報を含むテーブル/エンティティを設計することです。テーブルなどを簡単に作成できます。ユーザーが編集できるページのデータストアスキーマを設計する(例:wikipedia/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に表示されます。

このようにすると、example.com/tournament/7 URLはnoとなるため、更新されたデータで新しいエンティティを作成して以前のエンティティでApprovalStatus = 3に設定する可能性は排除されます正しいIDを要求してください。

また、データストアIDの生成(URLに基​​づいて正しいエンティティを簡単に取得できるようにすること)を活用することは素晴らしいと思うので、独自のIDを作成することは嫌いです。私はリビジョンを追跡する新しいエンティティ/テーブルを作成することを検討しましたが、どれがどれぐらい効率的かはわかりませんので、専門家が助言を与えることができるようになることを期待していました。


@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

あなたができることの1つは、単にトーナメントのeditを表す新しいエンティティを作成することです。

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 
} 

この:ところで、私はので、私は、これはあなたがエンティティをモデル化する方法をであるかはわからないが、一般的な考え方は、ほとんどのために同じである、すべてではないが、データベースdatastoreユーザーではありませんよキュー内の異なるユーザーから複数の編集を受けたり、特定の編集をCRUDしたり、その状態によって編集をフィルタリングしたりすることができます。

+0

更新された質問をご覧ください。私はそれがこのようにすることができるということを意味すると思いますか?このシナリオでは、以前に承認されたエンティティが中止に設定されるため、ApprovalStatus = 1のエンティティが1つだけ存在する可能性があります(ApprovalStatus = 3) – fisker

+0

「TournamentID」が実行される限り、リレーショナル'postgres'のようなデータベースですが、gaeの' datastore'とGoの関係をどのようにモデル化すればいいのか分かりませんが、もしあなたのアップデートの例があなたのために働くならば、おそらくそれはどうすればいいのでしょうか。 「ステータス」に関しては、新しいものを承認した後に最後に承認された編集を中止することは私には意味がある。 – mkopriva

+0

偉大な、ありがとう、もう一度、もう一度:) – fisker

関連する問題