У меня есть база данных PostgreSQL с таблицей с именем TIRE
, где я сохраняю некоторую информацию о шинах, в другой таблице с именем VEHICLE
и хранится вся информация об автомобиле.
Мне также нужно составить карту, какая шина ассоциируется с каким транспортным средством и в каком положении.Для покрытия этого сценария у меня есть таблица с именем VEHICLE_TIRE
.
. Вот структура таблиц (упрощенная, чтобы охватить только мою проблему):
ШИНА:
ID | GARAGE_ID
ТРАНСПОРТНОЕ СРЕДСТВО:
ID | PLATE_NUMBER | GARAGE_ID
VEHICLE_TIRE
VEHICLE_ID | TIRE_ID | TIRE_POSITION
У каждого клиента есть несколько гаражей, где находятся его транспортные средства.Им нужно знать, в каком гараже их шины и транспортные средства.Это указано в столбце GARAGE_ID
.Шины не обязательно связаны с транспортным средством (нет записи для этой шины в VEHICLE_TIRE
), потому что это может быть серийная шина конкретного гаража.
В любой момент клиент может перевезти транспортные средства ишины среди его гаражей в системе.Конечно, если он передаст транспортное средство, все связанные с ним шины также должны быть переданы.Клиент также может отсоединить шину от транспортного средства и передать только эту конкретную шину.
Мой вопрос заключается в том, как на уровне базы данных убедиться, что шины, связанные с транспортным средством, всегда находятся в одном и том же месте.гараж и предотвратить состояние, когда шина находится в одном гараже, а автомобиль находится в другом (разные garage_ids).
Единственное решение, с которым я пришел, - это использовать триггер в обеих таблицах, VEHICLE
и TIRE
, чтобы гарантировать, что в каждом ОБНОВЛЕНИИ этого несоответствия не будет.
Еще одна вещь, которую следует учитывать, - это то, что таблицы VEHICLE
и TIRE
являются огромными таблицами, общими для всех клиентов, и обновления часто, поэтому я 'Я обеспокоен накладными расходами, которые добавит мое решение.
Могу ли я достичь той же цели, используя другой подход?
РЕДАКТИРОВАТЬ:
SQL Fiddle с решением, использующим уникальные ограничения.
Такие обновления заблокированы: UPDATE VEHICLE_TIRE SET VEHICLE_ID = 2 WHERE VEHICLE_ID = 1