Как лучше хранить и быстро искать связанные данные?
У нас есть задача:
- есть много возможных вариантов значений (синонимов) одной и той же сущности, скажем, варианты значений Id клиента
- в разное время состав их может меняться и эту историю не всегда можно проследить (связать старое состояние (множество) и новое)
- нужно уметь находить по 1-му любому варианту значения (синониму) все возможные, существовашие когда-либо значения (синонимы)
Может быть, это стандартная задача и она как-то уже решается.
Пробуем сейчас раскладывать такие данные в цепочки с последовательной сменой одного значения на другое в таблице реляционной БД с 2-мя полями: Id, ParentId. Но это не совсем то, что нужно - ни по смыслу, ни искать неудобно (через рекурсию).
Посоветуете что-нибудь?
Надеюсь этот id - не первичный ключ таблицы клиентов.
Если у вас штатно есть действие на смену именно первичного ключа, то это не есть хорошо, что-то в на этапе проектирования базы не учли.
Нужно больше сведений о структуре таблиц, где у вас имеются идентификаторы клиентов и что из них повторяется/меняется.
Нет, это просто некий текстовый идентификатор. И данные эти импортируются в нашу "историю" из внешних систем, сгруппированные по группам (группа синонимов). Нам просто нужно уметь хранить и искать все исторические идентификаторы, которые когда либо входившие в группы.
Таблица групп.
Таблица терминов.
Таблица, связывающая термин и группу, с полями даты начала и конца валидности связи. Для актуальной связи конец - в далёком будущем.
А, собственно, всё.
Разве что ещё мелочь - при расщеплении группы в новую группу выделяется меньшая подгруппа терминов, а если равно - то любая.