Я уже давно использую низкоуровневый API хранилища данных для App Engine в Java и пытаюсь найти лучший способ обработки отношений один-ко-многим. Представьте себе отношения один ко многим, например: «У каждого учащегося может быть ноль или более компьютеров, но каждый компьютер принадлежит ровно одному ученику».
Два варианта:
- попросите студента сохранить список ключей компьютеров, связанных со студентом
- пусть компьютерная сущность хранит один Ключ студента, которому принадлежит компьютер
У меня есть ощущение, что вариант два лучше, но мне любопытно, что думают другие.
Преимущество первого варианта заключается в том, что вы можете получить все «manys» обратно без использования Query. Можно запросить хранилище данных для всех сущностей, используя get () и передавая сохраненный список ключей. Проблема этого подхода заключается в том, что хранилище данных не может выполнять какую-либо сортировку значений, возвращаемых из get (). Вы должны сделать сортировку самостоятельно. Кроме того, вы должны управлять списком, а не одним ключом.
Второй вариант кажется хорошим, потому что нет списка для ведения. Кроме того, вы можете сортировать по свойствам компьютера, если они являются индексом для этого свойства. Представьте себе, что вы пытаетесь получить все компьютеры для ученика, где результаты сортируются по дате покупки. При втором подходе это простой запрос, в нашем коде сортировка не выполняется (об этом заботится индекс хранилища данных)
Сортировка не очень сложная, но требует немного больше времени (~ O (nlogn) для сортировки), чем сортированный индекс (~ O (n) для просмотра индекса). Компромисс - это индекс (пространство в хранилище данных) для времени обработки. Как я уже сказал, мой инстинкт подсказывает мне, что второй вариант является лучшим общим решением, поскольку он дает разработчику немного больше гибкости в получении результатов в порядке упорядочения за счет дополнительных индексов (которые в модели ценообразования Google довольно дешевы). Кто-нибудь соглашается, не соглашается или имеет комментарии?