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关系.在这种情况下,对于复合主键有一个很好的论据.但是,在您的情况下,贷款只有一个客户,因此第二种方法似乎更“正确”.
标签:relationship,foreign-keys,sql,mysql,php 来源: https://codeday.me/bug/20191111/2017733.html