猿问

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

我正在使用 Go 和 Google Datastore 在 Google App Engine 中构建目录应用程序。我正在使用数据存储的Ancestor功能来管理不同的产品类别。以下是一些数据的示例:

Musical Instruments -> Guitars -> Gibson -> Les Paul

Musical Instruments -> Guitars -> Fender -> Stratocaster

Musical Instruments -> Bass Guitars -> Music Man -> Stingray

乐器是根实体。当我点击它时,我希望看到GuitarsBass Guitars,但我看到的是所有东西都是Musical Instruments最后一个实体的后代。这不是我要找的。在这一点上,我只对乐器的直系后代感兴趣。

一些帖子,比如这个帖子,建议在数据存储中创建一个字段来跟踪直接父母。但是,如果我要手动跟踪父实体,为什么要使用这些Ancestor功能呢?它会比过滤匹配直接父字段的查询更快吗?

这是获取类别的方法:

func (cat *Category) GetCategories(r *http.Request, pk string) ([]CategoryReturn, error) {

//get context

c := appengine.NewContext(r)


var q *datastore.Query

var err error


//get parent key

k, err := datastore.DecodeKey(pk)


if err != nil {

    //handle error

    return []CategoryReturn{}, err

}


q = datastore.NewQuery("Category").Ancestor(k)


//populate category slices

var categories []CategoryReturn

keys, err := q.GetAll(c, &categories)


if err != nil {

    //handle error

    return []CategoryReturn{}, err

}


//create return object

results := 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


}


桃花长相依
浏览 188回答 1
1回答

慕容3067478

您需要考虑应用程序中确实需要强一致性的任何部分,然后考虑哪些实体和实体组需要参与相应的查询和事务(现在跨组事务中最多可以有 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切片)代表类别树的分支。
随时随地看视频慕课网APP

相关分类

Go
我要回答