【问题标题】:mySQL many to many relation with all members of a group having a common attributemySQL 与具有共同属性的组的所有成员的多对多关系
【发布时间】:2012-06-14 07:29:42
【问题描述】:

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

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

--编辑--

这是简化的架构。我正在使用 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) ;

【问题讨论】:

  • Arg,写完一个答案,你的编辑引入了一个新的限制:一个工作人员只能与一个站点相关。
  • 啊抱歉,我没有意识到这会有所作为!我对 sql 还很陌生。
  • 工人可以在不同的地点吗?

标签: mysql sql many-to-many constraints


【解决方案1】:

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

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

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 的组中。

【讨论】:

  • 太好了,干杯!我不确定这是否可能。
  • @DenverCoder8 - 不是。我撒了谎。不,等等,我没有。嗯,我没有撒谎还是我没有撒谎? Arg,我想你只需要尝试一下。但即便如此,也可能只是矩阵,没有外键……
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多