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