Добрый день!
Меня интересует вопрос того, как правильно организовать структуру таблиц в базе данных MySQL, если с её помощью надо описать следующую условную ситуацию:
Есть некоторое число работников. Работник может работать, а может не работать. Если работник работает, значит должен быть указан завод, на котором он работает, а также цех, в котором он работает.
Есть некоторое число заводов, однако не все из них подразделяются на цеха.
Вопрос: какие должны быть созданы таблицы и какие должны быть связи между ними.
Самое незамысловатое решение, конечно же, это создать таблицу работников:
CREATE TABLE `worker` (
`id` INT UNSIGNED NOT NULL ,
`plant_id` INT NOT NULL,
`department_id` INT NOT NULL
) ENGINE = InnoDB;
таблицу заводов:
CREATE TABLE `plant` (
`id` INT UNSIGNED NOT NULL
) ENGINE = InnoDB;
и таблицу цехов:
CREATE TABLE `department` (
`id` INT UNSIGNED NOT NULL,
`plant_id` INT NOT NULL,
) ENGINE = InnoDB;
Однако данное решение содержит ряд неприятных моментов:
- неработающий работник будет содержать в себе plant_id = NULL, department_id = NULL (хотя второе прямо вытекает из первого)
- работник, работающий на заводе, где нет цехов, будет содержать в себе department_id = NULL (хотя, по большому счету, это свойство целого завода, а не конкретного работника)
- работник, работающий на заводе, где есть цеха, буде содержать в себе plant_id = x, department_id = y, а в это же время в таблице department будет id = y, plant_id = x (т.е. будет некоторая избыточность)
Могли бы посоветовать каноничный, наиболее нормализованный и эталонный вариант решения данной задачи?
И если у цехов разных заводов будут разные свойства, их также не хотелось бы хранить в одной таблице. Как должны быть при этом организованы таблица(-ы) цехов, и как на них должен ссылаться завод и работник?
Спасибо.