Давайте на мгновение задумаемся об одном-многих; если вы хотите, чтобы объект A «имел много» объектов B, есть только два способа сделать это:
Реляционный способ: сделайте так, чтобы каждый B указывал на A. Когда у вас есть A0 и вам нужны все B, которые относятся к нему, просто запросите B, которые указывают на данный A0.
Способ NoSQL/ObjectStore: сделайте так, чтобы у A было поле, содержащее список указателей (ключей) на B-s. Обратите внимание, что этот способ также позволяет B-s быть в определенном порядке (несмотря на документы GAE/Java об обратном).
Какой из них лучше, зависит. Способ ObjectStore ограничен размером объекта. Реляционный способ связан с тонкой проблемой, заключающейся в том, что если A и все B не находятся в одной и той же группе сущностей, и вы выполняете запрос предка в транзакции (или, может быть, даже если это не в транзакции), вы гарантированно получите все из B, которые указывают на этот A. Однако, если A и B охватывают группы сущностей, возможно (хотя и маловероятно), что вы получите B, который не удовлетворяет предикату запроса, или пропустите букву Б, которая делает: https://developers.google.com/appengine/articles/transaction_isolation а>
В (теперь стандартном) хранилище данных с высоким уровнем репликации транзакция обычно полностью применяется в течение нескольких сотен миллисекунд после возврата фиксации. Однако, даже если он не применяется полностью, последующие запросы чтения, записи и предков всегда будут отражать результаты фиксации, поскольку эти операции перед выполнением применяют любые незавершенные изменения. Однако запросы, охватывающие несколько групп сущностей, не могут определить, есть ли какие-либо незавершенные изменения перед выполнением, и могут возвращать устаревшие или частично примененные результаты.
Теперь о многих-многих: однажды я прочитал историю, в которой описывалось посещение туалета в космосе; было четыре комбинации: внутри/снаружи космического корабля и два вида посещения туалета. Для последней комбинации пребывания вне корабля (в скафандре) и устранения твердых тел единственным ответом было «изящного пути не существует» (также название статьи): http://поселение.arc.nasa.gov/CoEvolutionBook/SPACE.HTML#Там Нет Изящного Путь ... и это также ответ на многие-многие отношения в GAE. Вы можете создать их с помощью класса соединения, и каждая сторона соединения может быть реализована с помощью запроса или списка ключей.
person
Daniel
schedule
19.05.2012