我正在使用 Go 和 Google Datastore 在 Google App Engine 中构建目录应用程序。我正在使用数据存储的Ancestor功能来管理不同的产品类别。以下是一些数据的示例:Musical Instruments -> Guitars -> Gibson -> Les PaulMusical Instruments -> Guitars -> Fender -> StratocasterMusical Instruments -> Bass Guitars -> Music Man -> Stingray乐器是根实体。当我点击它时,我希望看到Guitars和Bass Guitars,但我看到的是所有东西都是Musical Instruments最后一个实体的后代。这不是我要找的。在这一点上,我只对乐器的直系后代感兴趣。一些帖子,比如这个帖子,建议在数据存储中创建一个字段来跟踪直接父母。但是,如果我要手动跟踪父实体,为什么要使用这些Ancestor功能呢?它会比过滤匹配直接父字段的查询更快吗?这是获取类别的方法:func (cat *Category) GetCategories(r *http.Request, pk string) ([]CategoryReturn, error) {//get contextc := appengine.NewContext(r)var q *datastore.Queryvar err error//get parent keyk, err := datastore.DecodeKey(pk)if err != nil { //handle error return []CategoryReturn{}, err}q = datastore.NewQuery("Category").Ancestor(k)//populate category slicesvar categories []CategoryReturnkeys, err := q.GetAll(c, &categories)if err != nil { //handle error return []CategoryReturn{}, err}//create return objectresults := make([]CategoryReturn, 0, 20)for i, r := range categories { k := keys[i] y := CategoryReturn { Name: r.Name, Id: k.IntID(), Key: k.Encode(), } results = append(results, y)}return results, nil}
1 回答
慕容3067478
TA贡献1773条经验 获得超3个赞
您需要考虑应用程序中确实需要强一致性的任何部分,然后考虑哪些实体和实体组需要参与相应的查询和事务(现在跨组事务中最多可以有 25 个),但你以这种方式使用祖先为我敲响了警钟。
通过将实体组视为逻辑构建数据模型的一种方式,很容易被它们所吸引(我有!),但这可能会导致问题,最终导致不必要的大型实体组上的写入争用。
相反,最好考虑应用程序中需要强一致性的点并围绕它设计实体组。
在这种情况下,我可能只有一个parentCategory
属性(类型datastore.Key
)。然后,您可以像这样查询乐器的子类别:
k := datastore.NewKey(c, "Category", "Musical Instruments", 0, nil) q := datastore.NewQuery("Category").Filter("parentCategory =", k)
(我对 Go 很陌生,所以以上可能是一个近似值)
每个类别中假设你有某种形式的Product
,你想查询所有Product
内给予A SCategory
在树中在任何级别(例如,电视广播员在吉他,或的Minimoog的乐器,那么你可能需要一个多值属性(在去我猜这可能是一个[]datastore.Key
切片)代表类别树的分支。
- 1 回答
- 0 关注
- 187 浏览
添加回答
举报
0/150
提交
取消