2

パーツとオブジェクト間の多対多の関係を実装する次のテーブルがあるとします。ここで、リンク テーブルには重複する行がないように一意のキー ペア (object_id、part_id) があります。

部品表:

part_id | パーツ名 | part_zone
--------+-----------+----------  
0 | part1.0 | 上  
1 | パート2 | 下  
2 | パート1.1 | 上
3 | パート3 | 上

オブジェクト テーブル:

object_id | object_name
---- ----+-------------
0 | オブジェクト1
1 | object2
2 | object3
3 | object4

リンク テーブル:

object_id | part_id
------ --+---------
0 | 0
0 | 1
1 | 1
1 | 2

オブジェクト内の各 part_zone は 1 つだけであるべきであるというさらなる制約があります。そのため、part_zone 列をリンク テーブルに移動し、キーを一意のペア (object_id、part_zone) に変更した場合、これは満たされます。ただし、part_zone は part テーブルにある必要があるため、これは行いたくありません。私の頭の中では、テーブルをそのまま維持しようとしていますが、(object_id,part_zone) 一意のキーを使用して、part_id の結合を介して part_zone を part テーブルから取得します。

私の意図が明確であることを願っていますが、これが必ずしも最良の実装であるか、または私が求めているものに対して正しい用語を使用しているかについてはあまり確信が持てません。

洞察を提供できる人に事前に感謝します。

4

1 に答える 1

0

テーブルで参照するカスケード複合外部キー制約を使用して、にpart_zone追加できます。そうすれば、テーブルから維持しながら、提案どおりに制約を定義できます。Link(part_zone, part_id)PartUNIQUE(object_id, part_zone)part_zonePart

ALTER TABLE Link ADD part_zone varchar(10);  -- should be same size as in Part
ALTER TABLE Part ADD INDEX (part_zone, part_id);

UPDATE Link JOIN Part USING (part_id) SET Link.part_zone = Part.part_zone;

ALTER TABLE Link
  ADD FOREIGN KEY (part_zone, part_id) REFERENCES Part (part_zone, part_id)
    ON UPDATE CASCADE,
  ADD UNIQUE INDEX (object_id, part_zone)
;

手動で行う必要がないように、トリガーを定義して値を入力することもできINSERTますUPDATELink

CREATE TRIGGER link_insert BEFORE INSERT ON Link FOR EACH ROW
  SET NEW.part_zone = (SELECT part_zone FROM Part WHERE part_id = NEW.part_id);

CREATE TRIGGER link_update BEFORE UPDATE ON Link FOR EACH ROW
  SET NEW.part_zone = (SELECT part_zone FROM Part WHERE part_id = NEW.part_id);
于 2012-11-19T23:59:58.310 に答える