моделирование в google-datastore: использовать списки или отдельные сущности? - PullRequest
1 голос
/ 19 января 2012

Я застрял, пытаясь реализовать модель данных для приложения, которое будет развернуто в AppEngine.

Вот пример модели:

EntityName
  id:  1
  author:       'me'
  description:  'whatever'
  datetime:     2011 etc.
  events: [
    {location: [1,2], phase: ['A', 'B']},
    {location: [3,4], phase: ['C', 'B']},
    ... more events ...
  ]

Объяснение:

  • EntityName имеет несколько атрибутов, и многие events
  • каждый event имеет список чисел (location) и список строк (phase)

Как эта модель может быть реализована в AppEngine? Данные должны быть доступны для поиска только по id, author, datetime и description.


То, что я пытался выяснить, как это сделать (все еще просматривая документы) (точка вставки курсивом) :

  1. одна таблица,EntityName, с events в качестве ListProperty
    для этого потребуются вложенные списки в одной таблице ... не уверен, если это возможно
  2. две таблицы EntityName и Event
    нуждаются в объединении, что, как я понимаю, не представляется возможным напрямую

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Это не совсем таблицы, но я думаю, что это должно работать для вас

class EntityName(db.Model):
    author = db.StringProperty(...)

class Event(db.Model):
    entity_name = db.ReferenceProperty(EntityName, collection_name='events')
    location = db.StringListProperty()
    phase = db.StringListProperty()

Тогда ...

e = EntityName(author='me', ...)
e.put()
event = Event(entity_name=e, location=...)
event.put()

for ev in e.events:
    print ev.location
    print ev.phase

Подробнее см. В документации .Вам не нужно «делать соединение», потому что это не база данных SQL.Для вашего удобства collection_name создаст итератор на ссылочной стороне отношения один-ко-многим.

0 голосов
/ 25 июля 2012

Вот альтернатива, в которой используется только одна модель (то есть идея Ника):

import webapp2
from google.appengine.ext import db

class EntityName(db.Model):
    author = db.StringProperty()
    # ...
    event_locations = db.StringListProperty(indexed=False)
    event_phases    = db.StringListProperty(indexed=False)

class MainHandler(webapp2.RequestHandler):
    def get(self):
        e = EntityName(author='me',
            event_locations=['1,2', '3,4'], event_phases=['A,B', 'C,D'] )
        e.put()

        q = EntityName.all().filter('author =', 'me')
        text = ''
        for en in q:
            for locations, phases in zip(en.event_locations, en.event_phases):
                text += "location=%s, phase=%s<br>" % (locations, phases)
        self.response.out.write(text)

app = webapp2.WSGIApplication([('/', MainHandler)], debug=True)    

Пример вывода:

location=1,2, phase=A,B
location=3,4, phase=C,D

Поскольку Порядок в целом сохраняется в свойствах List и StringList ваши местоположения и фазы для события могут быть сопоставлены, т. е. они имеют одинаковый индекс в двух списках.

С одной моделью вам придется немного больше разделить работукаждая запись в списке, но вы сохраняете данные для чтения и записи в хранилище данных, поскольку у вас есть только одна сущность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...