php - 识别关系相对于非识别关系的优缺点,反之亦然

标签 php mysql sql foreign-keys relationship

让我们想象一下现实世界中简单的customer-loan关系场景,没有客户的贷款是不可能存在的,因此逻辑上的关系应该是多对一识别关系以下结构:

CREATE TABLE `customer` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(50)
) ENGINE = InnoDB;

CREATE TABLE `loan` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `customer_id` INT NOT NULL,
  `amount` FLOAT,
  `currency` VARCHAR(10),
  PRIMARY KEY (`id`, `customer_id`),
  CONSTRAINT `identifying_fk` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`)
) ENGINE = InnoDB;

另一方面,技术上相同的逻辑可以应用于具有以下结构的多对一非标识强制关系:

CREATE TABLE `customer` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(50)
) ENGINE = InnoDB;

CREATE TABLE `loan` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `customer_id` INT NOT NULL,
  `amount` FLOAT,
  `currency` VARCHAR(10),
  CONSTRAINT `non-identifying_fk` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`)
) ENGINE = InnoDB;

问题:与非识别关系相比,使用识别关系有哪些优点和缺点,反之亦然?是否有任何技术偏好选择一个而不是另一个?

注意。 使用标识关系的缺点之一复合主键,这通常难以维护。

例如 PHP Doctrine ORM 不支持对这样的组合键进行操作,其中一个 id 是自动生成的,第二个键(外键)是父实体的标识符。

最佳答案

如果您有一个 auto_increment 列,那么它应该是主键。通常,我避免使用复合主键。他们只是在外键定义和连接条件中引入了错误范围。您还指出了使用其他工具时的局限性。

我希望这个问题是针对 n-m 关系。在这种情况下,有一个很好的理由支持复合主键。但是,在您的情况下,贷款只有一个客户,因此第二种方法似乎更“正确”。

关于php - 识别关系相对于非识别关系的优缺点,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45255252/

相关文章:

javascript - 通过 AJAX 和 PHP MYSQL JSON 到 JavaScript 变量 => 数组未定义

php - 如何使用单个查询更新mysql中的单列和多行

php - Laravel - 在数据库中的一列中插入动态图像数组 JQuery

php - 价格搜索表

MySQL - 如何将 LIMIT 应用于 GROUP?

php - 在 JSON 中添加其他对象

SQL Server FileStream - 如何获取文件路径

android - 如何在 Room 中使用 Joda DateTime 日期作为 id,或者如何在查询中获取日期?

mysql - 根据sql中重复的列ID为重复行值创建新列

python - 函数序列错误 (0) (SQLFetch) - SQL、Pyodbc