Проектирование базы данных и моделирование конкретных отношений
Я пытаюсь реализовать решение для доставки и отслеживания.
Есть TRUCKS
этот ход PRODUCTS
из CITY
другому CITY
через назначенный PATHS
по конкретным SCHEDULES
, TRUCKS
транспортировать PRODUCTS
с помощью CONTAINERS
, Эти TRUCKS
проинструктированы через JOBS
, лайк pick_up
, transfer
, drop_off
,
Проблема, которая у меня возникает, когда product_1
должен быть перемещен truck_1
через pick_up
JOB
от city_A
в city_C
с помощью city_B
, В то же время, есть product_2
тронут truck_2
через JOB
из pick_up
от city_C
в city_A
с помощью city_B
, И то и другое trucks
Можно transfer
(JOB
) их containers
(и по существу product
и просто возвращайтесь к их происхождению city
т.е. для truck_1
, вернуться к city_A
и для truck_2
, вернуться к city_C
через команду drop_off
(JOB
).
Итак, у меня есть следующие таблицы:
- TRUCK (truck_id, код грузовика,...)
- PRODUCT (идентификатор продукта, код продукта, имя продукта,...)
- CONTAINER (container_id, container_desc,...)
- CITY (city_id, city_name, city_desc,...)
- PATH (path_id, from_city_id, to_city_id,...)
- SCHEDULE (schedule_id, schedule_name, schedule_desc, start_time, end_time,...)
- TRANSACTION (транзакция_id, транзакция_имя, транзакция_деск,...)
Как я могу смоделировать сценарий выше, где CONTAINERS
передаются между TRUCKS
?
1 ответ
Предположительно, у грузовика и / или дальнобойщика есть задание, включающее в себя прохождение последовательности событий, в том числе следование по пути и выполнение поставок и транзакций и т. Д. Предположительно, работа - это такое событие, из которых существует несколько видов, например, получение, передача и оставите машину.
Таблицы в реляционной базе данных описывают состояние приложения. С каждой таблицей связан оператор заполнения (предиката). Предикаты базовой таблицы предоставляются дизайнером:
// truck [truck_id] has code [truck_code] and ...
TRUCK (truck_id, truck_code, ...)
// product [product_id] has code [product_code] and name [product_name] ...
PRODUCT (product_id, product_code, product_name, ...)
(Предикат характеризует отношение приложения, то есть отношение, представленное таблицей, то есть отношением, отсюда "реляционная модель".)
Параметры предиката - это столбцы таблицы. Когда вы предоставляете значения для каждого параметра, вы получаете утверждение (предложение), которое является истинным или ложным для вашего приложения. Строка значений для столбцов дает такие значения для каждого именованного пробела. Строки, которые делают предикат таблицы истинным, попадают в таблицу. Строки, которые составляют, если ложь, остаются вне. Вот как состояние базы данных описывает ситуацию приложения. Вы должны знать операторы таблиц, чтобы читать или запрашивать базу данных, чтобы узнать по ее строкам, что является правдой и ложью в ситуации, и обновить базу данных, поместив в нее именно те строки, которые делают истинные предложения после наблюдения за ситуацией.,
У каждого запроса также есть предикат, построенный из предикатов его таблиц. СОЕДИНЕНИЕ двух таблиц дает строки, которые удовлетворяют AND своих предикатов, UNION OR и т. Д. И результат запроса также содержит строки, которые удовлетворяют его предикату.
(Ограничения не имеют отношения к этому; они просто в совокупности описывают состояния базы данных, которые могут возникнуть с учетом предикатов и состояний приложения, которые могут возникнуть.)
Вам нужно определиться с достаточным количеством предикатов, чтобы иметь возможность полностью описать положения вашего приложения. Это включает в себя такие абстрактные вещи, как маршруты, транзакции, события, расписания, назначения и т. Д. (Как только у нас появятся достаточные предикаты / таблицы, мы улучшаем их с помощью таких методов, как нормализация).
Когда могут быть разные вещи, мы говорим о супертипах и подтипах и видим предикаты вроде (я буду использовать "задание", которое я использую как событие):
// job [job_id] for trucker [trucker_id] is ... stuff about all jobs ...
JOB(job_id, trucker_id...)
// job [job_id] is a pickup with ... stuff about pickups ...
PICKUP(job_id, container_id...)
// job [job_id] is a transfer with ... stuff about transfers
TRANSFER(job_id,...)
...
(Вы можете иметь или не иметь другое или дополнительное понятие передачи как события с двумя или более ассоциированными контейнерами и т. Д.) (Поиск "подтипов". Например.)