Итак, у вас есть функция, которая делает что-то вроде этого (псевдокод):
int getId(char **path) {
int id = 0;
int i;
char query[1000];
for (i = 0; path[i] != NULL; i++) {
sprintf(query, "select id from table where parent = %d and name = '%s'", id, name);
id = QuerySimple(query);
if (id < 0)
break;
}
return id;
}
глядя на запрос, вам нужен (не уникальный) индекс по столбцам (родитель, имя), но, возможно, он у вас уже есть.
(временная) таблица может использоваться, как вы сказали, обратите внимание, что вы можете изменить разделитель пути в своей программе, избегая необходимости разных таблиц для Windows и Unix. Вам также необходимо поддерживать дополнительную таблицу в синхронизации с мастером. если обновления / удаления / вставки редки, вместо таблицы вы можете просто сохранить в памяти кеш уже просмотренных данных и очистить кеш при обновлении (вы также можете сделать частичное удаление в кеше, если хотите ). В этом случае вы также можете прочитать больше данных (например, если родитель прочитал все дочерние элементы), чтобы быстрее заполнить кэш. В крайнем случае, вы можете прочитать всю таблицу в памяти и работать там! это зависит от того, сколько у вас данных, ваши типовые шаблоны доступа (сколько операций чтения, сколько операций записи) и среды развертывания (у вас есть резервная память?).