微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-识别关系的优缺点(非识别),反之亦然

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

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;

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

注意使用标识关系的缺点之一是复合PRIMARY KEY,通常很难维护.

例如,PHP Doctrine ORM不支持对此类复合键进行操作,在这种复合键中,会自动生成一个ID,而第二个键(外键)是父实体的标识符.

解决方法:

如果您有一个auto_increment列,则该列应为主键.通常,我避免使用复合主键.他们只是介绍了外键定义和联接条件中的错误范围.您还指出了使用其他工具时的限制.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐