为了账号安全,请及时绑定邮箱和手机立即绑定

祖先查询直接后代 - Google 数据存储

祖先查询直接后代 - Google 数据存储

Go
桃花长相依 2021-11-15 15:29:24
我正在使用 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切片)代表类别树的分支。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信