Google app engine 如何在Go中实现一对多的应用程序引擎?

Google app engine 如何在Go中实现一对多的应用程序引擎?,google-app-engine,google-cloud-datastore,go,Google App Engine,Google Cloud Datastore,Go,如何在Go编程语言的Google App Engine上实现一对多 例如,如果我有下面的结构,我将如何存储多个投票与一条评论的关联?我会在注释结构中使用一个键数组(切片)来投票,还是在注释结构中使用一个键来投票 类型注释结构{ 作者字符串 内容字符串 日期数据存储。时间 } 类型投票结构{ 用户字符串 分数整数 } 我还没有试过,但也许值得一试: type Vote struct { User string Score int } type Comment struct

如何在Go编程语言的Google App Engine上实现一对多 例如,如果我有下面的结构,我将如何存储多个投票与一条评论的关联?我会在注释结构中使用一个键数组(切片)来投票,还是在注释结构中使用一个键来投票

类型注释结构{
作者字符串
内容字符串
日期数据存储。时间
}
类型投票结构{
用户字符串
分数整数
}

我还没有试过,但也许值得一试:

type Vote struct {
    User string
    Score int
}    

type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
    Votes*  []Vote
}

Go AppEngine SDK当前版本中允许的字段类型只有:

  • 带符号整数(int、int8、int16、int32和int64)
  • 布尔
  • 浮动32和浮动64
  • 基础类型为上述预声明类型之一的任何类型
  • *钥匙
  • 阿彭金·布洛基
  • []字节(最长可达1兆字节)
  • 上述任意元素的切片(长度不超过100个元素)
鉴于此,似乎有两种方法可以做到这一点。一种是维护一段键,以指向给定评论的投票。然而,对于任何合理流行的评论,这可能会达到100个元素的限制

另一种方法是在每个投票结构中存储一个指向注释的“指针”,如下所示:

key, err := datastore.Put(context, datastore.NewIncompleteKey(context, model.DB_KIND_VOTE, commentKey), &vote)
类型投票结构{
用户字符串
分数整数
CommentKey*datastore.Key
}    
类型注释结构{
作者字符串
内容字符串
日期数据存储。时间
}
然后,当您要查询它时,您需要分两步进行。首先,你会得到你感兴趣的评论(在本例中,只是第一个碰巧返回的评论)。其次,查询“指向”该评论的所有投票:

q:=datastore.NewQuery(“Comment”).Limit(1)
注释:=make([]注释,0,1)
var err os.Error
var keys[]*datastore.Key
如果是键,err=q.GetAll(c,&注释);呃!=零{
//处理错误
}
注释:=注释[0]
vq:=datastore.NewQuery(“投票”).Filter(“CommentKey=”,key[0])
投票:=作出([]票,0票,10票)
如果,err:=vq.GetAll(c,表决(&D);;呃!=零{
//处理错误
}

如何使用祖先路径将投票存储为注释的子项?我的意思是,在存储每个新的投票结构时,设置指向父注释的父键参数。大概是这样的:

key, err := datastore.Put(context, datastore.NewIncompleteKey(context, model.DB_KIND_VOTE, commentKey), &vote)

我的问题被编辑以删除对应用程序引擎和数据存储的引用。很抱歉回答了这个问题的人。谢谢,这是可行的,但是为什么我不使用密钥的IntID(),而不是整个密钥结构来指向注释呢?假设我使用的是应用程序引擎分配的int id。这不起作用。您只能在数据存储中存储特定类型。投票结构不是其中之一。@harm,我不同意你的观点。只要属性符合支持属性类型列表,它就可以工作。但是,如果子元素的数量将增长到一个巨大的列表,则不建议在父元素中保留子元素的引用。这适用于两个实体之间只有一个关系的情况。如果你有多个一对多的关系呢?据我所知,一个实体不能有多个祖先。关于实体路径,这是正确的。但是,
注释
,可以有多个
投票
子项(在数据存储中可以)。然后,您可以执行祖先查询以获取注释的所有
Vote
s:
datastore.NewQuery(“Vote”)。祖先(commentKey).