У меня возникли проблемы с ограничением ввода в реляционной базе данных. Heres сценарий:Ограничение ввода с отношениями базы данных
База данных: MySQL
Таблица 1:
CREATE TABLE IF NOT EXISTS `manufacturers` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`))
ENGINE = InnoDB
Таблица 2:
CREATE TABLE IF NOT EXISTS `models` (
`id` INT NOT NULL AUTO_INCREMENT,
`manufacturer_id` INT NOT NULL,
`name` VARCHAR(45) NOT NULL,
`created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`, `manufacturer_id`),
INDEX `fk_models_manufacturers_idx` (`manufacturer_id` ASC),
CONSTRAINT `fk_models_manufacturers`
FOREIGN KEY (`manufacturer_id`)
REFERENCES `manufacturers` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
Таблица 3:
CREATE TABLE IF NOT EXISTS `cars` (
`id` INT NOT NULL AUTO_INCREMENT,
`manufacturer_id` INT NOT NULL,
`model_id` INT NOT NULL,
`photo` TEXT NULL,
`price` DECIMAL(6,2) NULL DEFAULT 0.00,
`created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`, `manufacturer_id`, `model_id`),
INDEX `fk_cars_models1_idx` (`model_id` ASC, `manufacturer_id` ASC),
CONSTRAINT `fk_cars_models1`
FOREIGN KEY (`model_id` , `manufacturer_id`)
REFERENCES `models` (`id` , `manufacturer_id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
Я пишу приложения на PHP, где кто-то может добавить автомобиль в свою базу данных. Как вы можете видеть, модель и производитель автомобиля связаны с таблицей моделей, чтобы поддерживать автомобили, связанные их моделью и производителями. Как я могу убедиться, что когда кто-то добавляет автомобиль, они не смешивают модель и идентификаторы производителя, поэтому они не говорят, что модель A изготовлена производителем C, когда она изготовлена изготовителем B, и это говорится в таблице моделей.
Есть ли способ сделать это с отношениями? Довольно точно, что не удалось точно настроить таблицы, чтобы предотвратить это.
EDIT: Чтобы уточнить, только один производитель может сделать одну модель. Если производитель выпускает автомобиль с таким же названием, он будет новым, так как он будет иметь разные спецификации. Это небольшой дБ, так как я буду использовать столбцы объявлений, например, спецификации, просто пытаясь заставить работать базовую функциональность и понять, как mysql использует отношения для ограничения ввода.
Я бы удалил 'manufacturer_id' из' cars', так как он уже находится в 'models'. Если вам нужно найти производителя автомобиля, просто присоединитесь к «моделям». –