У меня есть глубокая иерархическая модель, которая выглядит следующим образом:
Счета
-> Места проведения
-> События
-> Списки гостей
-> Билеты
И мне нужно сделать запрос, в котором я выбираю заявки на основе родительских списков гостей ИЛИ событий, ИЛИ мест проведения ИЛИ учетных записей, чтобы это выглядело примерно так:
Запрос:
select * from user_detail ud, venue v, event e, guest_list g, ticket t
where
t.guest_list = g.id
and g.event = e.id
and e.venue = v.id
and (
ud.guest_list = t.guest_list
or ud.event = g.event
or ud.venue = e.venue
or ud.account = v.account
)
Это, конечно, очень дорогой запрос, и, поскольку у меня есть миллионы билетов, - это не совсем так, как я надеялся.
Неидеальное решение (хранение избыточных родительских ссылок на уровне заявки)
Решение, о котором я думаю, состоит в том, чтобы оптимизировать это путем сохранения не только прямого родителя, но и всех супер-родителей в строке заявок, поэтому вместо ссылки только на таблицу списка гостей я бы также сослался на родительские события, место проведения и счет за каждый билет.
Несмотря на то, что это было бы довольно просто выполнить, это означает, что я буду хранить избыточные данные, а смена родителя может быть хлопотной и подверженной ошибкам.
Идеальное решение (все, что не требует избыточных данных)
Есть предложения?