如何在Go中的App Engine上实现一对多?

问题描述

| 如何使用Go编程语言在Google App Engine上实现一对多? 例如,如果我具有以下结构,我将如何存储许多投票与一个评论的关联?我将在Comment结构中使用一串键(切片)来投票,还是在Vote结构中使用一键来评论
type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
}

type Vote struct {
    User string
    score int
}
    

解决方法

Go AppEngine SDK当前版本中的字段仅允许使用以下类型: 有符号整数(int,int8,int16,int32和int64), 布尔 串, float32和float64, 任何基础类型为上述预定义类型之一的类型, *键, appengine.BlobKey, []个字节(最大1兆字节), 以上任何一项的切片(长度最多100个元素)。 鉴于此,似乎有两种方法可以做到这一点。一种是维护一片键以指向给定评论的投票。但是,对于任何合理流行的评论,这很可能超出100个元素的限制。 另一种方法是在每个表决结构中为注释存储一个“指针”,如下所示:
type Vote struct {
    User string
    Score int
    CommentKey *datastore.Key
}    

type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
}
然后,当您查询它时,您需要分两个步骤进行。首先,您会得到您感兴趣的Comment(在这种情况下,只有第一个碰巧返回的评论)。其次,您查询对该评论“指向”的所有投票:
q := datastore.NewQuery(\"Comment\").Limit(1)
comments := make([]Comment,1)
var err os.Error
var keys []*datastore.Key
if keys,err = q.GetAll(c,&comments); err != nil {
    // handle the error
}

comment := comments[0]
vq := datastore.NewQuery(\"Vote\").Filter(\"CommentKey=\",keys[0])

votes := make([]Vote,10)
if _,err := vq.GetAll(c,&votes); err != nil {
    // handle the error
}
    ,如何使用祖先路径将投票存储为Comment的子项?我的意思是在存储每个新的Vote结构时,设置指向父Comment的父键参数。像这样:
key,err := datastore.Put(context,datastore.NewIncompleteKey(context,model.DB_KIND_VOTE,commentKey),&vote)
    ,我没有尝试过,但是也许值得尝试:
type Vote struct {
    User string
    Score int
}    

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...