当前位置: 首页 > 面试题库 >

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

党航
2023-03-14
问题内容

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

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

}

问题答案:

您将需要考虑应用程序中确实需要高度一致性的任何部分,然后考虑哪些实体和实体组需要参与相应的查询和事务(现在,跨组事务中最多可以包含25个),但是您以这种方式使用祖先会为我敲响警钟。

通过将实体组视为逻辑上构建数据模型的一种方式,很容易被实体组所吸引(我有!),但这可能会导致问题,最终导致不必要的大型实体组发生写争用。

相反,最好考虑一下应用程序中需要强一致性的点,并围绕这些点设计实体组。

在这种情况下,我可能只有一个parentCategory属性(类型为datastore.Key)。然后,您可以查询 乐器的 子类别,如下所示:

k := datastore.NewKey(c, "Category", "Musical Instruments", 0, nil)
q := datastore.NewQuery("Category").Filter("parentCategory =", k)

(我刚开始使用Go,所以上面的内容可能是一个近似值)

每个类别中假设你有某种形式的Product,你想查询所有Product内给予A S Category在树中在任何级别(例如, 电视广播员
吉他 ,或 的Minimoog乐器
,那么你可能需要一个多值属性(在去吧,我想这可能是一个[]datastore.Key切片),代表了类别树的分支。



 类似资料:
  • 主要内容:向上遍历 DOM 树,jQuery parent() 方法,实例,jQuery parents() 方法,实例,实例,jQuery parentsUntil() 方法,实例祖先是父、祖父或曾祖父等等。 通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先。 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() parentsUntil() jQuery parent() 方法 parent() 方法返回被

  • 在我的项目中,大量数据来自json格式的服务器。为了获取这些数据,计划每小时运行一个cron任务,它会返回我们保存到文件中的那一个小时的数据。这组数据将用于分析目的,并将有很多测量点,基于这些测量点将呈现分析报告和图表。现在由于数据会很重,决定使用HADOOP进行数据存储。我看了很多文章,发现有一个用于输入处理的映射器文件和用于输出的还原器文件,但没有找到动态数据的好例子。 但我想知道如何直接解析

  • 问题内容: 我目前正在尝试测试一段代码,以便在放入新实体之前在数据存储上运行查询,以确保不创建重复项。我编写的代码在应用程序上下文中运行良好,但是我为该方法编写的测试失败。似乎我无法通过测试包上下文中的查询访问放入数据存储区的数据。 一种可能性在于从输出内容如下:。在调用get和put方法之后,此行将打印出来(我使用log语句对此进行了验证)。 我尝试关闭上下文并为不同的操作创建一个新的上下文,但

  • 问题内容: 在我的应用程序中,我有一个带有过滤器的数据存储区查询,例如: 我正在使用游标迭代结果的批次(例如在不同的任务中)。如果在迭代时更改的值,则光标将不再在Google App Engine上工作(在devappserver上正常工作)。 我在这里有一个测试项目:https : //github.com/fredr/appenginetest 在我的测试中,我运行了将db设置为10个项目并将

  • SqliteOpenHelper只是一个工具,是SQL世界和OOP之间的一个通道。我们要新建几个类来请求已经保存在数据库中的数据,和保存新的数据。被定义的类会使用ForecastDbHelper和DataMapper来转换数据库中的数据到domain models。我仍旧使用默认值的方式来实现简单的依赖注入: class ForecastDb( val forecastDbHelper:

  • 我的问题是树中有大量的节点和许多查询。是否有一种算法,它进行预处理,使查询能够在恒定的时间内得到答复。 我研究了使用RMQ的LCA,但我不能使用该技术,因为我不能对树中的这么多节点使用数组。 如果知道它是满二叉树,节点之间的关系如上所示,那么有人能给我一个高效的实现来快速回答许多查询。 但是当有很多查询时,这种算法非常耗时,因为在最坏的情况下,我可能必须遍历30的高度(树的最大高度)才能到达根(最