Я пишу отображение Fluent NHibernate для устаревшей базы данных Oracle. Проблема в том, что таблицы имеют составные первичные ключи. Если бы у меня была полная свобода, я бы перепроектировал отношения и автоматически сгенерировал первичные ключи, но другие приложения должны писать в ту же базу данных и читать из нее, поэтому я не могу этого сделать.
Вот две таблицы, на которых я сосредоточусь:
Пример данных
Trips table:
1, 10:00, 11:00 ...
1, 12:00, 15:00 ...
1, 16:00, 19:00 ...
2, 12:00, 13:00 ...
3, 9:00, 18:00 ...
Faults table:
1, 13:00 ...
1, 23:00 ...
2, 12:30 ...
В данном случае ТС 1 совершило три поездки и имеет две неисправности. Первая неисправность произошла во время второй поездки, а вторая – во время стоянки автомобиля. Автомобиль 2 совершил одну поездку, во время которой возникла неисправность.
Ограничения
Поездки одного и того же транспортного средства никогда не пересекаются. Таким образом, таблицы имеют необязательную связь "один ко многим", потому что каждый сбой либо происходит во время поездки, либо нет. Если бы я хотел присоединиться к ним в SQL, я бы написал:
select ...
from Faults left outer join Trips
on Faults.VehicleId = Trips.VehicleId
and Faults.FaultTime between Trips.TripStartTime and Trips.TripEndTime
а затем я получу набор данных, в котором каждая ошибка появляется ровно один раз (как я уже сказал, один ко многим).
Обратите внимание, что таблицы Vehicles нет, да она мне и не нужна. Но я создал представление, содержащее все VehicleId из обеих таблиц, поэтому я могу использовать его как соединительную таблицу.
Что я на самом деле ищу?
Таблицы огромны, потому что они охватывают годы данных, и каждый раз мне нужно получить диапазон всего за несколько часов.
Поэтому мне нужно сопоставление и критерии, которые будут запускать что-то вроде следующего ниже SQL:
select ...
from Faults left outer join Trips
on Faults.VehicleId = Trips.VehicleId
and Faults.FaultTime between Trips.TripStartTime and Trips.TripEndTime
where Faults.FaultTime between :p0 and :p1
У вас есть идеи, как этого добиться?
Примечание 1. В настоящее время приложение не должно выполнять запись в базу данных, поэтому постоянство не является обязательным, хотя, если сопоставление поддерживает постоянство, это может помочь в будущем.
Примечание 2: я знаю, что это сложный вопрос, поэтому, если вы дадите мне отличный ответ, вы будете должным образом вознаграждены :)
Спасибо, что прочитали этот длинный вопрос, и теперь я надеюсь только на лучшее :)