2

假设我有以下表,它们实现了部件和对象之间的多对多关系,其中链接表具有唯一的密钥对 (object_id,part_id),因此没有重复的行:

零件表:

part_id | 零件名 | 部分区域
--------+------------+----------  
0 | 部分1.0 | 最佳  
1 | 第 2 部分 | 底部  
2 | 第 1.1 部分 | 最佳
3 | 第 3 部分 | 最佳

对象表:

object_id | 对象名
---- ----+-----------
0 | 对象1
1 | 对象2
2 | 对象3
3 | 对象4

链接表:

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

还有一个进一步的限制是,一个对象中的每个 part_zone 应该只有一个。因此,如果将 part_zone 列移动到链接表并将键更改为唯一对 (object_id,part_zone),那么这将得到满足。但是我不想这样做,因为 part_zone 应该在零件表中。在我的脑海中,我希望保持表格原样,但使用 (object_id,part_zone) 唯一键,其中 part_zone 通过 part_id 上的连接从零件表中提取。

希望我的意图很明确,但我不太确定这是否一定是最好的实现,或者我正在使用正确的术语来表达我所追求的。

提前感谢任何可以提供任何见解的人。

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)
;

您甚至可以定义触发器INSERTUPDATE填充值,Link这样您就不需要手动执行它:

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