Подтвердить что ты не робот

Как я могу реализовать один-ко-многим в App Engine в Go?

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

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

type Vote struct {
    User string
    Score int
}
4b9b3361

Ответ 1

Единственными типами, допустимыми для полей текущей версии Go AppEngine SDK, являются следующим образом:

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

Ответ 2

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

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

Ответ 3

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

type Vote struct {
    User string
    Score int
}    

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