Я пишу отображение 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
и тогда я получу набор данных, в котором каждая ошибка появляется ровно один раз (как я сказал один-ко-многим).
Обратите внимание, что нет стола Транспортных средств, и он мне не нужен. Но я создал представление, которое содержит все идентификаторы транспортных средств из обеих таблиц, поэтому я могу использовать его в качестве соединительной таблицы.
Что я на самом деле ищу?
Таблицы огромны, потому что они охватывают данные за многие годы, и каждый раз, когда мне нужно выбрать диапазон в несколько часов.
Так что мне нужно сопоставление и критерии, которые будут запускать что-то вроде следующего 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: Я знаю, что это сложный вопрос, поэтому, если вы дадите мне отличный ответ, вы будете должным образом вознаграждены:)
Спасибо за чтение этого длинного вопроса, и теперь я надеюсь только на лучшее:)