Подход, который вы предлагаете, будет работать нормально;Вы можете смоделировать 'position_Key_list' позиции элемента как свойство списка, и оно будет работать так, как вы ожидаете.Вам не нужно использовать оператор IN - это для сопоставления одного значения в хранилище данных со списком имеющихся у вас ключей (например, «WHERE datastore_column IN ('a', 'b', 'c')), в то время каквы делаете обратное - сопоставление одного значения со списком в хранилище данных.
Я хотел бы предложить, однако, что обратное лучше подходит для вашей задачи: у каждого Назначения должен быть список позицииключи. Это работает во многом таким же образом, но для извлечения всех данных о встрече вы вместо этого сначала извлекаете встречу, а затем массово получаете позиции, используя ключи из сущности Назначение. Если вы знаете ключНазначение, таким образом вы вообще избегаете необходимости выполнять какие-либо запросы.
Я пытался объяснить Пиндатюху, почему запрос свойства списка не менее эффективен, чем однозначный, но, по-видимому,требуется более подробное описание, поэтому без лишних слов, вот ...
Краткое руководство по индексации хранилища данных App Engine
Хотя Python и Java предоставляют различные высокоуровневые интерфейсы для хранилища данных, само хранилище данных говорит на низкоуровневой абстракции, называемой сущностями.Сущность состоит из следующих элементов:
- Уникальный первичный ключ
- Список пар (имя, значение)
Первичный ключ - хранилище данныхключ, с которым вы уже знакомы.Список пар (имя, значение) представляет собой представление App Engine для данных в вашей сущности.Пока все просто.Сущность со следующими значениями:
a_string = "Hello, world"
an_int = 123
будет сериализована в нечто похожее на это:
[('a_string', 'Hello, world'), ('an_int', 123)]
Но как это взаимодействует со списками?Ну, списки рассматриваются как «многозначные» свойства.То есть список с n элементами хранится как n отдельных свойств.Пример, вероятно, делает это более понятным:
a_string = "Hello, world"
an_int = 123
a_list_of_ints = [42, 314, 9]
будет сериализовано как:
[('a_string', 'Hello, world'), ('an_int', 123), ('a_list_of_ints', 42), ('a_list_of_ints', 314), ('a_list_of_ints', 9)]
Как вы можете видеть, список будет представлен серией значений с одинаковым именем.Когда вы загружаете данные из хранилища данных, SDK видит повторяющееся значение и превращает его в список.
Важным моментом является взаимодействие с индексированием.Предположим, у вас есть индекс для «a_string» и «an_int».Когда вы вставляете или изменяете значение, App Engine генерирует для него набор записей индекса;для вышеуказанного индекса и вышеуказанного объекта он генерирует одну строку в индексе, которая выглядит примерно так:
('Hello, world', 123, a_key)
(здесь «a_key» - это заполнитель для ключа исходного объекта.) КогдаВы делаете запрос, который использует этот индекс, ему просто нужно выполнить поиск по индексу, чтобы найти строки с соответствующим префиксом (например, «SELECT * FROM KIND WHERE a_string =« Hello, world »ORDER BY an_int ').
Когда вы индексируете список, App Engine вставляет несколько строк индекса.Индекс 'an_int' и 'a_list_of_ints' будет генерировать эти строки для вышеуказанной сущности:
(123, 42, a_key)
(123, 314, a_key)
(123, 9, a_key)
Опять же, запросы работают так же, как и раньше - App Engine просто нужно искать строку справильный префикс в индексе.Количество записей в списке не влияет на скорость выполнения запроса - только на то, сколько времени потребовалось для создания и записи записей индекса.Фактически, планировщик запросов не имеет представления о том, что a_list_of_ints является многозначным свойством - он просто обрабатывает его как любую другую запись индекса.
Итак, в двух словах:
- Естьнет практической разницы между списком с одним элементом и отдельным свойством в терминах индексирования и запроса
- Размер индексированного списка влияет на время и пространство, необходимые для индексации, но не для запросов.
- Вы можете выполнить запрос, который сопоставляет любую сущность с данным значением в списке, используя простой фильтр равенства.