Лучший способ сохранить последовательность, используя таблицу соответствия - PullRequest
0 голосов
/ 28 мая 2018

У меня есть база данных 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

1 Ответ

0 голосов
/ 28 мая 2018

Я бы добавил garage_id к vehicle_tire, добавил garage_id к первичным ключам tire и vehicle (или добавил бы новое уникальное ограничение).

Затем вы можете добавить garage_id к внешним ключам, и ваша проблема должна быть решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...