Я сомневаюсь, что существует единый подход, который оптимизирует все возможные сценарии использования. Как вы сказали, есть два основных сценария, которые поддерживает таблица TagMapping
: поиск тегов для данного элемента и поиск элементов с данным тегом. Я думаю, что есть некоторые различия в том, как вы будете использовать таблицу TagMapping
для каждого сценария, который может представлять интерес. Я могу только делать разумные предположения, основываясь на типичных приложениях тегирования, так что простите, если это далеко от базы!
Поиск тегов для данного элемента
A1. Вы собираетесь одновременно отобразить всех тегов для данного элемента
A2. Вы убедитесь, что все тегов предмета уникальны
Поиск элементов по заданному тегу
B1. Вам понадобится несколько элементов для данного тега за раз (чтобы заполнить страницу результатов поиска)
B2. Вы можете разрешить пользователям указывать несколько тегов, поэтому вам нужно будет найти некоторые элементов, соответствующих нескольким тегам
B3. Вы собираетесь отсортировать элементы по заданному тегу (или тегам) по некоторому показателю популярности
Учитывая вышесказанное, я думаю, что хорошим подходом было бы разбиение TagMapping
по элементам. Таким образом, все теги для данного элемента находятся в одном разделе. Разбиение может быть более детальным, поскольку, вероятно, элементов гораздо больше, чем тегов, и у каждого элемента есть только несколько тегов. Это делает поиск простым (A1) и уникальность может быть обеспечена в пределах одного раздела (A2). Кроме того, этот единственный раздел может сообщить вам, соответствует ли элемент нескольким тегам (B2).
Поскольку вам нужно только несколько элементов для данного тега (или тегов) за один раз (B1), вы можете запрашивать разделы по одному в некотором порядке, пока у вас не будет столько записей, сколько нужно заполнить страницу результатов. Сколько разделов вы будете запрашивать, будет зависеть от того, сколько разделов у вас есть, сколько результатов вы хотите отобразить и как часто используется тег. Каждый раздел будет иметь собственный индекс tag_id для эффективного ответа на этот запрос.
Порядок, в котором вы выбираете разделы, будет иметь важное значение, поскольку он будет влиять на группировку результатов поиска. Если порядок не важен (то есть B3 не имеет значения), выбирайте разделы случайным образом, чтобы ни один из ваших разделов не был слишком горячим. Если порядок важен, вы можете создать идентификатор элемента так, чтобы он кодировал информацию, относящуюся к порядку, в котором должны быть отсортированы результаты. Тогда соответствующая схема разбиения будет помнить об этой кодировке. Например, если результаты представляют собой URL-адреса, отсортированные по популярности, то вы можете объединить идентификатор последовательного элемента с оценкой рейтинга страницы Google для этого URL-адреса (или чего-либо подобного). Схема разделения должна гарантировать, что все элементы в данном разделе имеют одинаковую оценку. Запросы выбирают разделы в порядке очков, чтобы вначале возвращались более популярные элементы (B3). Очевидно, что это допускает только один вид сортировки, а используемые свойства должны быть постоянными, поскольку теперь они являются частью ключа и определяют раздел записи. Однако это не является новым ограничением, так как в любом случае нелегко поддерживать различные сортировки или сортировки по изменчивым свойствам с секционированными данными.