Как создать хранилище данных для огромной системы тегов (например, digg или delicious)?Как создать хранилище данных для многораздельной системы тегов?
Об этом уже есть discussion, но речь идет о централизованной базе данных. Поскольку данные должны расти, нам нужно будет разбить данные на несколько осколков скоро или позже. Итак, вопрос заключается в следующем: Как создать хранилище данных для многораздельной системы тегов?
Система мечения в основном имеет 3 таблицы:
Item (item_id, item_content)
Tag (tag_id, tag_title)
TagMapping(map_id, tag_id, item_id)
Это прекрасно работает для нахождения всех элементов для данного тега и найти все тег для данного элемента, если таблица хранится в одном экземпляре базы данных. Если нам нужно разбить данные на несколько экземпляров базы данных, это не так просто.
Для таблицы Item, мы можем разделить его содержимое с его ключом item_id. Для таблицы Тег, мы можем разделить его содержимое с его ключом tag_id. Например, мы хотим разбить таблицу тег на базы данных K. Мы можем просто выбрать номер (tag_id% K) базы данных для хранения данных тегов.
Но, как разбить стол TagMapping?
Таблица TagMapping представляет отношения "многие ко многим". Я могу только изображение, чтобы иметь дублирование. То есть, тот же контент TagMappping имеет две копии. Один разделен на tag_id, а другой разделен на item_id. В сценарии для поиска тегов для данного элемента мы используем раздел с tag_id. Если сценарий для поиска элементов для данного тега, мы используем раздел с item_id.
В результате имеется избыточность данных. И уровень приложений должен поддерживать согласованность всех таблиц. Это выглядит тяжело.
Есть ли какое-нибудь лучшее решение для решения этой проблемы раздела «многие-ко-многим»?
Я не уверен, что идея комбинированных item_id хороша. Популярность меняется во времени. Также трудно угадать популярность/рейтинг страницы/независимо при создании записи (это момент времени, когда должен быть рассчитан комбинированный item_id). – Wacek
Да, я согласен и обычно не рекомендую кодировать значения в ID. Популярность со временем меняется, но не слишком быстро. Если перемещение элементов между разделами не слишком сложно, это может быть подход OK. Вы можете использовать другой идентификатор для каждого элемента в «TagMapping», который со временем может меняться легче (вместо первичного ключа элемента, который, вероятно, используется во многих других местах). Фоновый процесс может постепенно пересчитывать эти новые идентификаторы и реорганизовывать записи в «TagMapping», чтобы отражать изменения в популярности. –