2

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

これを行うには、複合外部キーを使用します。

1つのフィールドだけで外部キーを使用する代わりに、複数(この場合は2つ)のフィールドで構成された外部キーを使用します。

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テーブルにリンクすることができます。コメントすると、グループ内のすべてのワーカーは同じサイトにいる必要があるため、サイトはグループの属性ですよね。ワーカーのテーブルからサイトフィールドを削除し、サイトテーブルを追加し、fkを使用してグループにSiteIDフィールドを追加します。これで十分です。

于 2012-06-13T23:27:31.457 に答える