2

我有一个包含两个外键的交叉引用表。RoleId(PK,FK) 和 PermissionId(PK,FK)。Role 表和 Permission 表都包含一个名为 ApplicationId 的外键列。我想确保一条记录不能插入到包含与 ApplicationId 1 关联的 RoleId 和与 ApplicationId 2 关联的 PermissionId 的交叉引用表中。除了使用触发器来完成这种类型的完整性之外,还有其他方法吗?

4

1 回答 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 回答