2016-03-13 5 views
0

У меня возникли проблемы с ограничением ввода в реляционной базе данных. 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 использует отношения для ограничения ввода.

+1

Я бы удалил 'manufacturer_id' из' cars', так как он уже находится в 'models'. Если вам нужно найти производителя автомобиля, просто присоединитесь к «моделям». –

ответ

0

Car стол имеет комбинацию model_id и manufacturer_id в качестве первичного ключа. Теперь, когда вы добавляете новый автомобиль, производитель_ид будет действовать как внешний ключ в таблице manufacturer, а model_id будет действовать как внешний ключ в таблице model.

Следовательно, не будет никаких столкновений, как вы говорите. Кроме того, таблица model имеет отношение много к одному с таблицей manufacturer с первичным ключом как id.

Это очень открытая проблема, вы можете найти другие способы разработки своей базы данных, она зависит от ваших потребностей и того, как вы хотите проецировать свою систему.

+0

Согласен. Многое зависит от требований. Возможна также небольшая табличка с отображением двух столбцов в одном и модель в другой. Может ли такая же модель быть построена двумя компаниями (Austin и Morris Mini)? Названия моделей могут столкнуться (Riley и Nissan Pathfinder), поэтому поиск пользователя не должен останавливаться в одном матче. – BryanT

Смежные вопросы