2013-06-09 5 views
0

Я смотрю пример GAE для хранения данных, и, среди прочего, это немного смутило меня.Проблемы с использованием ключа Google App Engine

def guestbook_key(guestbook_name=DEFAULT_GUESTBOOK_NAME): 
    """Constructs a Datastore key for a Guestbook entity with guestbook_name.""" 
    return ndb.Key('Guestbook', guestbook_name) 

Я понимаю, зачем нужен ключ, но зачем нужна «Гостевая книга»? Так вы можете запросить все объекты «Гостевая книга» в хранилище данных? Но если вам нужно искать хранилище данных для типа объекта, почему нет запроса (тип (Приветствие)? Учет того, что это ndb.model, который вы вводите?

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

greeting = Greeting(parent=guestbook_key(guestbook_name)) 
+0

Приветствие относится к гостевой книге. Таким образом, вы создаете группу сущностей для сильной согласованности. Подробнее см. В документах. https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency – voscausa

ответ

2

Первый: GAE Datastore - это одна большая распределенная база данных, используемая всеми приложениями GAE одновременно. Для отличия объектов GAE использует общесистемные ключи. Ключ состоит из:

  1. имя приложения (неявно устанавливается, не виден через API)
  2. пространство имен, устанавливается через Namespace API (если не установлен в коде, то используется пустое пространство имен).
  3. Вид сущности. Это всего лишь строка и не имеет ничего общего с типами на уровне базы данных. Datastore не имеет схемы, поэтому нет типов. Однако языковые API (Java JDO/JPA/objectify, Python NDB) сопоставляют это с классами/объектами.
  4. Родительские ключи (afaik, сериализованный внутри ключа). Это используется для создания групп сущностей (определение объема транзакций).
  5. Определенный идентификатор объекта: имя (строка) или идентификатор (длинный). Они уникальны в пространстве имен и типа (и родительского ключа, если они определены) - see this для получения дополнительной информации об уникальности идентификатора.

См. Key methods (java), чтобы узнать, какие данные фактически хранятся в ключе.

Второе: кажется, что GAE Python API не позволяет запрашивать Datastore без определения классов, которые отображаются в сущности вида (я не использую GAE Python, так что я могу ошибаться). У Java есть low-level API, которые можно использовать без сопоставления классам.

В-третьих: Вы не обязаны определять родителя для объекта. Определение родителя - это способ определения групп сущностей, которые важны при использовании транзакций. См. ancestor paths и transactions.

+0

Это похоже на ужасно много, чтобы создать ключ. Но я все еще не понимаю цели определения рода и родителя. – EasilyBaffled

2

Вот что ключ:. путь, состоящий из пар вида и ID ключ, что определяет, какие именно

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

+0

Я не уверен, что понимаю концепцию ключа здесь. Я могу принять его, но я привык к словарю, где ключ и объект одного типа указывают на другой объект некоторого типа. Поэтому я не понимаю необходимости печатать. Есть ли визуальное представление хранилища данных, на которое я могу смотреть?Что касается второго вопроса, какова точка родителя? И почему это хорошо или плохо, чтобы ключ был родителем? – EasilyBaffled

Смежные вопросы