2

是否可以在两个表之间建立多对多关系,并强制组的所有成员都具有共同的特定属性?

例如,一个工作人员可以在多个组中,一个组可以有多个工作人员,但一个组中的所有工作人员必须在同一个站点上。有足够多的工作人员和站点,我无法为每个站点创建一个新表。

- 编辑 -

这是简化的模式。我正在使用 mySQL 工作台,但我认为这是正确的:

-- -----------------------------------------------------
-- Table `DB`.`Worker`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `DB`.`Worker` (
  `workerID` INT NOT NULL ,
  `site` VARCHAR(45) ,
  PRIMARY KEY (`workerID`) ;

-- -----------------------------------------------------
-- Table `DB`.`Group`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `DB`.`Group` (
  `groupID` INT NOT NULL ,
  PRIMARY KEY (`groupID`) ;

-- -----------------------------------------------------
-- Table `DB`.`Worker_Group`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `DB`.`workerGroup` (
  `workerID` INT NOT NULL ,
  `groupID` INT NOT NULL ,
  PRIMARY KEY (`workerID`, `groupID`) ,
  INDEX `fk_Group` (`groupID` ASC) ,
  CONSTRAINT `fk_Worker`
    FOREIGN KEY (`workerID` )
    REFERENCES `DB`.`Worker` (`workerID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Group`
    FOREIGN KEY (`groupID`)
    REFERENCES `DB`.`Group` (`groupID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION) ;
4

2 回答 2

4

您可以通过使用复合外键来做到这一点。

您可以使用由多个(在本例中为两个)字段组成的外键,而不是仅在一个字段上使用外键。

CREATE TABLE site (
  id         INT AUTO_INCREMENT,
  name       VARCHAR(256),
  PRIMARY KEY (id)
)

CREATE TABLE worker (
  id         INT AUTO_INCREMENT,
  name       VARCHAR(256),
  site_id    INT,
  PRIMARY KEY (id, site_id),
  FOREIGN KEY (site_id) REFERENCES site (id)
)

CREATE TABLE group (
  id         INT AUTO_INCREMENT,
  name       VARCHAR(256),
  site_id    INT,
  PRIMARY KEY (id, site_id),
  FOREIGN KEY (site_id) REFERENCES site (id)
)

CREATE TABLE map_worker_group (
  worker_id  INT,
  site_id    INT,
  group_id   INT,
  PRIMARY KEY (worker_id, group_id, site_id),
  FOREIGN KEY (group_id,  site_id) REFERENCES group  (id, site_id),
  FOREIGN KEY (worker_id, site_id) REFERENCES worker (id, site_id)
)

现在一个组是特定于一个站点的,一个工人也是如此。在填充 worker:group 映射表时,您会引用两者的站点。这意味着工人只能在具有相同 site_id 的组中。

于 2012-06-13T23:29:42.580 回答
0

你没有网站表吗?也许您可以创建一个 Sites 表并将其链接到 GroupsSites 表中的 Groups 表,正如您评论的那样,一个组中的所有工作人员都必须在同一个站点中,所以 Site 是一个组的属性,不是吗?从您的 Worker 表中删除 Site 字段,添加一个 Sites 表,在 Groups 上添加一个 SiteID 字段,它的 fk 应该足够了。

于 2012-06-13T23:27:31.457 回答