tl; dr: Используйте отдельные поля для типа и идентификатор только для GUID и используйте индексы хэша для обоих.
Этот ответ обязательно будет несколько самоуверенным, основанным на характере ваших вопросов. Позвольте мне сначала обратиться к тому, что, как представляется, является вашей главной задачей, а именно фрагментация индексов, влияющих на производительность.
ДокументDB предполагает использование GUID, а хэш-индекс (в отличие от индекса диапазона) идеально подходит для поиска одного соответствующего объекта по GUID. С другой стороны, если вы хотите найти набор документов, посмотрев на начало строки, я подозреваю, что, вероятно, будет более эффективным с индексом диапазона. Это предполагает, что STARTSWITH оптимизируется только при использовании индексов диапазона, но я не знаю, что он оптимизирован, даже если у вас есть индекс диапазона.
Моей рекомендацией было бы использовать отдельные поля для типа и идентификатор только для GUID и использовать индексы хэша для обоих. Это дает вам преимущество в том, что вы уверены, что запросы, подобные тем, которые вы показываете, будут очень эффективными и что запросы, которые объединяют предложение типа с другими параметрами, также смогут использовать хотя бы один индекс. Обратите внимание, что хэш-индексы этого типа (скажем, 2x 3 байта = 6 байт/документ) очень эффективны в пространстве, поэтому не беспокойтесь о необходимости двух из них. Эти два комбината должны быть намного меньше одного индекса диапазона, который должен иметь достаточную точность для покрытия всей длины вашего типа + GUID.
Помимо обсуждений, связанных с производительностью и пространством, я вижу несколько других недостатков для объединения типа с GUID: 1) при попытке получить один документ (как для прямого использования, так и как часть иностранного ключевой поиск), имеющий отдельный идентификатор GUID и использование хеш-индекса будет быстрее и экономичнее, чем использование индекса диапазона в комбинированном поле; 2) Объединение типа с идентификатором значительно усложняет некоторые миграции, которые обычно необходимо выполнять позднее. Предположим, что вы решили, например, разбить своих пользователей на авторов и читателей. Пользователи являются иностранными ключами, указанными в других типах документов (автор сообщения в блоге, комментарий читателя и т. Д.).) по идентификатору пользователя. Если этот идентификатор включает этот тип, вам потребуется не только изменить пользовательские документы для выполнения миграции, но вам также необходимо будет найти и изменить каждый внешний ключ. Если два поля (GUID и тип) были разделены, тогда вам нужно будет только изменить пользовательские документы. Гибкое программное мастерство в значительной степени связано с принятием решений, которые обеспечивают гибкость в будущем.
Что касается использования последовательного индекса, то тренд в базах данных в целом и NoSQL в частности состоит в том, что сложность предоставления монотонно увеличивающегося последовательного идентификатора больше, чем преимущества использования пространства по сравнению с GUID. Если вы собираетесь придерживаться DocumentDB, я рекомендую вам просто пойти с потоком и использовать GUID.
Спасибо за отличный ответ! Я пытался придумать, как не добавлять это дополнительное поле типа в мои приложения POCOs, но я думаю, это просто необходимо. Теперь это немного больше. Я думаю, что это просто мои знания SQL и NoSQL, которые немного смешались, заставляя меня попытаться придумать что-то новое. – kspearrin
Рад помочь. Можете ли вы принять мой ответ? –