我有一个包含两个外键的交叉引用表。RoleId(PK,FK) 和 PermissionId(PK,FK)。Role 表和 Permission 表都包含一个名为 ApplicationId 的外键列。我想确保一条记录不能插入到包含与 ApplicationId 1 关联的 RoleId 和与 ApplicationId 2 关联的 PermissionId 的交叉引用表中。除了使用触发器来完成这种类型的完整性之外,还有其他方法吗?
问问题
1781 次
1 回答
1
您可以将 applicationId 列添加到交叉引用表中,然后扩展 Role 和 Permission 表的外键以包含 applicationId 列。这提供了所需的参照完整性。
这是mysql中制定的架构
CREATE TABLE `application` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `permission` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`applicationId` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id_app` (`id`,`applicationID`),
CONSTRAINT `FK_perm_app` FOREIGN KEY (`applicationID`) REFERENCES `application` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `role` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`applicationId` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id_app` (`id`,`applicationID`),
CONSTRAINT `FK_role_app` FOREIGN KEY (`applicationID`) REFERENCES `application` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `role_permission_application` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`roleID` int(11) unsigned NOT NULL,
`permissionID` int(11) unsigned NOT NULL,
`applicationID` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_role` (`roleID`,`applicationID`),
KEY `FK_permission` (`permissionID`,`applicationID`),
CONSTRAINT `FK_permission` FOREIGN KEY (`permissionID`,`applicationID`) REFERENCES `permission` (`id`,`applicationID`),
CONSTRAINT `FK_role` FOREIGN KEY (`roleID`,`applicationID`) REFERENCES `role` (`id`,`applicationID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
于 2013-12-07T16:22:38.853 回答