Каков наилучший способ обработки отношений «один ко многим» в API хранилища данных низкого уровня? - PullRequest
1 голос
/ 30 июня 2010

Я уже давно использую низкоуровневый API хранилища данных для App Engine в Java и пытаюсь найти лучший способ обработки отношений один-ко-многим. Представьте себе отношения один ко многим, например: «У каждого учащегося может быть ноль или более компьютеров, но каждый компьютер принадлежит ровно одному ученику».

Два варианта:

  • попросите студента сохранить список ключей компьютеров, связанных со студентом
  • пусть компьютерная сущность хранит один Ключ студента, которому принадлежит компьютер

У меня есть ощущение, что вариант два лучше, но мне любопытно, что думают другие.

Преимущество первого варианта заключается в том, что вы можете получить все «manys» обратно без использования Query. Можно запросить хранилище данных для всех сущностей, используя get () и передавая сохраненный список ключей. Проблема этого подхода заключается в том, что хранилище данных не может выполнять какую-либо сортировку значений, возвращаемых из get (). Вы должны сделать сортировку самостоятельно. Кроме того, вы должны управлять списком, а не одним ключом.

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

Сортировка не очень сложная, но требует немного больше времени (~ O (nlogn) для сортировки), чем сортированный индекс (~ O (n) для просмотра индекса). Компромисс - это индекс (пространство в хранилище данных) для времени обработки. Как я уже сказал, мой инстинкт подсказывает мне, что второй вариант является лучшим общим решением, поскольку он дает разработчику немного больше гибкости в получении результатов в порядке упорядочения за счет дополнительных индексов (которые в модели ценообразования Google довольно дешевы). Кто-нибудь соглашается, не соглашается или имеет комментарии?

Ответы [ 2 ]

1 голос
/ 30 июня 2010

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

0 голосов
/ 30 июня 2010

Рассматривали ли вы сделать оба?Затем вы можете быстро получить список компьютеров, которыми владеет студент, по клавише ИЛИ использовать запрос, который возвращает результаты в некотором отсортированном порядке.Я не думаю, что ведение списка ключей в модели ученика настолько пугающе, как вы думаете.

Не стоит недооценивать преимущества извлечения сущностей непосредственно по ключам.Согласно этой статье , это может быть в 4-5 раз быстрее, чем запросы.

...