有一个名为consists_of
的表,它与产品类别层次结构相关。
CREATE TABLE consists_of(
super_name VARCHAR(80),
sub_name VARCHAR(80),
UNIQUE(super_name, sub_name),
PRIMARY KEY(sub_name),
FOREIGN KEY(sub_name) REFERENCES category(name),
FOREIGN KEY(super_name) REFERENCES category(name),
CHECK (sub_name <> super_name)
);
如何防止循环关系,例如:
INSERT INTO consists_of values ('Cheese', 'Cheddar')
INSERT INTO consists_of values ('Cheddar', 'Cheese')
为了防止第二个INSERT
语句,这个索引就足够了:
CREATE UNIQUE INDEX ON consists_of (
least(super_name, sub_name),
greatest(super_name, sub_name)
);
但这并不能阻止三个或三个以上条目的循环。
我可以想象的一件事是对每个类别都有一个级别。然后您可以强制要求sub_name
的级别必须低于super_name
的级别。