将如何在应用程序引擎上实现一对多的Go?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

例如,如果我有下面的结构,我将如何将多个投票的关联存储到一个评论中?我是使用注释结构中投票的键数组(片)还是从选票结构中使用注释的一个键?

type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
}

type Vote struct {
    User string
    Score int
}
提问于
用户回答回答于

当前版本的goAppEngineSDK中允许字段的唯一类型是:

  • 有符号整数(int、int 8、int 16、int 32和int 64)
  • 布尔
  • 弦乐
  • 浮动32和64
  • 基础类型为上述预声明类型之一的任何类型,
  • *钥匙
  • 应用工程师BobKey
  • []里字节(长度可达1兆字节),
  • 上面任何一个元素的切片(长度可达100个元素)。

有鉴于此,似乎有两种方法可以做到这一点。一种是维护一小部分键,以指向给定评论的投票。然而,对于任何合理流行的评论,这可能会遇到100个元素限制。

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

type Vote struct {
    User string
    Score int
    CommentKey *datastore.Key
}    

type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
}

然后,当去查询它时,需要分两步完成。首先,将得到你感兴趣的评论(在本例中,只是返回的第一个注释)。第二,查询所有“指向”评论的投票:

q := datastore.NewQuery("Comment").Limit(1)
comments := make([]Comment, 0, 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, 0, 10)
if _, err := vq.GetAll(c, &votes); err != nil {
    // handle the error
}
用户回答回答于

存储每个新的投票结构时,设置指向父注释的父键参数。就像这样:

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

扫码关注云+社区