Как мне реализовать один-ко-многим на App Engine в Go? - PullRequest
18 голосов
/ 25 мая 2011

Как мне реализовать один-ко-многим в Google App Engine на языке программирования Go?
Например, если у меня есть приведенные ниже структуры, как бы я сохранил ассоциацию многих голосов в одном комментарии?Буду ли я использовать массив (фрагмент) ключей для голосов в структуре комментариев или один ключ для комментариев из структуры голосования?

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

type Vote struct {
    User string
    Score int
}

Ответы [ 3 ]

17 голосов
/ 31 мая 2011

Для полей в текущей версии Go AppEngine SDK допустимы только следующие типы: : :

  • целые числа со знаком (int, int8, int16, int32 и int64),
  • BOOL
  • строка
  • float32 и float64,
  • любой тип, базовый тип которого является одним из указанных выше объявленных типов,
  • * Key
  • 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
}

Затем, когда вы отправите запрос, вам нужно сделать это в два шага. Сначала вы получите комментарий, который вас интересует (в данном случае только первый, который был возвращен). Во-вторых, вы запрашиваете все голоса, которые «указывают» на этот комментарий:

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
}
4 голосов
/ 13 апреля 2013

Как насчет хранения голосов в качестве дочерних элементов комментариев, используя пути предков?Я имею в виду установить параметр родительского ключа, указывающий на родительский комментарий, при сохранении каждой новой структуры голосования.Как то так:

key, err := datastore.Put(context, datastore.NewIncompleteKey(context, model.DB_KIND_VOTE, commentKey), &vote)
0 голосов
/ 25 мая 2011

Я не пробовал это, но, возможно, стоит попробовать:

type Vote struct {
    User string
    Score int
}    

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