Мне крайне необходим алгоритм или помощь в построении запросов.
У нас есть сгенерированная пользователем гибкая база данных, созданная с помощью созданного нами конструктора форм. Данные для этих форм хранятся в двух таблицах следующим образом:
Таблица экземпляров сообщает нам, какую форму просматривает пользователь, а затем таблица instance_records содержит все данные для экземпляра. Столбец field_id сообщает нам, к какому полю формы относятся данные. Причина, по которой мы используем одну таблицу, подобную этой, вместо создания таблицы для каждой формы, заключается в том, что MySQL ограничивает количество столбцов, которые мы можем иметь в таблице, учитывая, что данные представляют собой varchar значительной длины. Одна возможность - использовать текстовые поля для данных, но тогда мы потеряем встроенные возможности поиска MySQL.
Вещи работают довольно хорошо и очень быстро на основных формах. Проблема в том, что один экземпляр формы может ссылаться на другой экземпляр формы. Например, у нас есть созданная пользователем форма под названием «Встречи». В этой форме это относится к форме пациента, форме техника, форме доктора и т. Д.
Таким образом, в форме «Назначение» с идентификатором экземпляра значение для поля пациента фактически является идентификатором экземпляра пациента, значение поля «доктор» является идентификатором экземпляра для доктора и т. Д. На первом уровне ссылок вещи не так уж плохо Но вы можете иметь цепочки ссылок. У меня может быть рецепт, который относится к назначению, которое относится к пациенту и т. Д. Поэтому, если я хочу получить значение имени пациента в рецепте, я должен следовать по цепочке вниз, чтобы получить правильный идентификатор и поле экземпляра. идентификатор для данных.
Итак, если я хочу сделать отчет о встречах и показать имя пациента, имя доктора и имя техника, мне нужно пройти через несколько обручей. Я попробовал создать представления, а затем соединить их с окончательным представлением, в котором отображаются все данные для запроса. Но он съедает тонну памяти и начинает записывать временные таблицы представления на диск и становится все медленнее. Используя кэширование запросов, во второй раз, когда отчет запускается, это быстро, как черт. Но этот первый запуск может занять более минуты, когда мы превысим 5000-7000 экземпляров.
Что-то щекочет у меня в голове, что может быть какой-то способ хранения данных таким образом, чтобы я мог воспользоваться некоторыми более быстрыми алгоритмами поиска по дереву.