使用数据库关系限制输入
Restricting input with database relationships
我无法理解在关系数据库中限制输入。场景如下:
数据库:MySQL
Table 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
Table 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
Table 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 中编写一个应用程序,有人可以在其中将汽车添加到他们的数据库中。如您所见,汽车的型号和制造商与模型 table 相关联,以保持汽车由其型号和制造商链接。
我如何确保当有人添加汽车时,他们不会混淆模型和制造商 ID,这样他们就不会说模型 A 是由制造商 C 制造的,而它是由制造商 B 制造的,并且它在模型 table 中说到。
有没有办法用关系做到这一点?很确定只是不确定如何正确设置 tables 来防止这种情况。
编辑:澄清一下,只有一家制造商可以生产一种型号。如果制造商生产的汽车具有相同的型号名称,那么它将是一个新条目,因为它具有不同的规格。这是一个小数据库,因为我稍后会在像规格这样的列中添加广告,只是试图让基本功能正常工作并了解 mysql 如何使用关系来限制输入。
Car
table 将 model_id
和 manufacturer_id
的组合作为主键。现在当你添加一辆新车时,manufacturer_id 将作为 manufacturer
table 中的外键,而 model_id
将作为 [=15= 中的外键] table。
所以不会像你说的那样发生冲突。
此外,model
table 与 manufacturer
table 具有多对一关系,主键为 id
。
这是一个非常开放的问题,您可以找到其他方法来设计您的数据库,这实际上取决于您的需求以及您希望如何规划您的系统。
我无法理解在关系数据库中限制输入。场景如下:
数据库:MySQL
Table 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
Table 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
Table 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 中编写一个应用程序,有人可以在其中将汽车添加到他们的数据库中。如您所见,汽车的型号和制造商与模型 table 相关联,以保持汽车由其型号和制造商链接。 我如何确保当有人添加汽车时,他们不会混淆模型和制造商 ID,这样他们就不会说模型 A 是由制造商 C 制造的,而它是由制造商 B 制造的,并且它在模型 table 中说到。
有没有办法用关系做到这一点?很确定只是不确定如何正确设置 tables 来防止这种情况。
编辑:澄清一下,只有一家制造商可以生产一种型号。如果制造商生产的汽车具有相同的型号名称,那么它将是一个新条目,因为它具有不同的规格。这是一个小数据库,因为我稍后会在像规格这样的列中添加广告,只是试图让基本功能正常工作并了解 mysql 如何使用关系来限制输入。
Car
table 将 model_id
和 manufacturer_id
的组合作为主键。现在当你添加一辆新车时,manufacturer_id 将作为 manufacturer
table 中的外键,而 model_id
将作为 [=15= 中的外键] table。
所以不会像你说的那样发生冲突。
此外,model
table 与 manufacturer
table 具有多对一关系,主键为 id
。
这是一个非常开放的问题,您可以找到其他方法来设计您的数据库,这实际上取决于您的需求以及您希望如何规划您的系统。