【问题标题】:Restricting input with database relationships使用数据库关系限制输入
【发布时间】:2016-06-28 17:09:11
【问题描述】:

我在限制关系数据库中的输入方面遇到了麻烦。场景如下:

数据库: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 编写一个应用程序,其中有人可以将汽车添加到他们的数据库中。如您所见,汽车的型号和制造商从 Models 表中链接起来,以保持汽车的型号和制造商之间的联系。 我如何确保当有人添加汽车时,他们不会混淆型号和制造商 ID,因此当制造商 B 制造时,他们不会说型号 A 是制造商 C 制造的,并且它在 Models 表中显示。

有没有办法通过关系来做到这一点?很确定只是不确定如何正确设置表格以防止这种情况发生。

编辑:澄清一下,只有一家制造商可以生产一种型号。如果制造商制造了相同型号名称的汽车,它将是一个新条目,因为它会有不同的规格。这是一个小型数据库,因为我稍后会发布诸如规范之类的列,只是试图让基本功能正常工作并了解 mysql 如何使用关系来限制输入。

【问题讨论】:

  • 我会从cars 中删除manufacturer_id,因为它已经在models 中。如果您需要查找汽车制造商,只需加入 models

标签: mysql database foreign-keys relational-database


【解决方案1】:

Car 表具有 model_idmanufacturer_id 的组合作为主键。现在,当您添加新车时,manufacturer_id 将充当manufacturer 表中的外键,model_id 将充当model 表中的外键。

因此不会像你说的那样发生任何冲突。 此外,model 表与manufacturer 表具有多对一关系,主键为id

这是一个非常开放的问题,您可以找到其他方法来设计您的数据库,这实际上取决于您的需求以及您希望如何规划您的系统。

【讨论】:

  • 我同意。很大程度上取决于要求。一个小型的两列表映射品牌和模型在另一个中也是可能的。两家公司(奥斯汀和莫里斯迷你)可以制造相同的模型吗?型号名称可能会发生冲突(Riley 和 Nissan Pathfinder),因此用户的搜索不应停留在一个匹配项上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多