Разработка схемы Bigtable - это открытый процесс, и в основном вам нужно подумать о:
- Шаблоны доступа, которые вы будете использовать, и как часто будет использоваться каждый из них
- Отношения между вашими типами
- Какие показатели вам понадобятся
- Шаблоны записи, которые вы будете использовать (для эффективного распределения нагрузки)
Хранилище данных GAE автоматически денормализует ваши данные. То есть каждый индекс содержит (в основном) полную копию данных, и, таким образом, каждый индекс значительно увеличивает время, необходимое для выполнения записи, и используемое пространство хранения.
Если бы это было не так, разработка схемы хранилища данных потребовала бы гораздо больше усилий: вам нужно было бы тщательно продумать первичный ключ для каждого типа и учитывать влияние вашего решения на локальность данных. Например, при отображении сообщения в блоге вам, вероятно, потребуется отобразить комментарии, чтобы согласиться с ним, поэтому ключ каждого комментария, вероятно, будет начинаться с ключа соответствующего сообщения.
С Datastore это не такая уж большая проблема: используемый вами запрос будет выглядеть примерно так: «Выбрать * ОТ КОММЕНТАРИИ ГДЕ post_id = N.» (Если вы хотите разместить комментарии на странице, у вас также будет предложение limit и возможный суффикс «AND comment_id> last_comment_id».) Как только вы добавите такой запрос, Datastore создаст для вас индекс, и ваши чтения будут волшебно быстро.
Следует иметь в виду, что каждый дополнительный индекс создает некоторую дополнительную стоимость: лучше всего использовать как можно меньше шаблонов доступа, так как это уменьшит количество индексов, которые построит GAE, и, следовательно, общий требуемый объем памяти. по вашим данным.
Читая этот ответ, я нахожу его немного расплывчатым. Может быть, практический вопрос о дизайне поможет обойти это? : -)