外键取决于第二个外键

时间:2011-05-23 11:30:51

标签: postgresql foreign-keys

我的问题很简单,但我找不到任何解决方案。假设我有以下内容:

Table food:
id (key);
category_id;
food_id

Table category:
category_id (key);
category_names [fruits, vegetables]

Table fruits
food_id (key);
fruit [apple, banana]

Table vegetables
food_id (key);
vegetable [bean, carrot]

我现在想要从table food到table fruits + vegetables建立一个外键约束,具体取决于category_id中指定的类别。这可能吗?

3 个答案:

答案 0 :(得分:1)

如果您的问题非常简单,那么只需使用VIEWS:

CREATE TABLE food (
  id SERIAL,
  name TEXT NOT NULL,
  category TEXT NOT NULL,
  PRIMARY KEY(id),
  CHECK(category = 'fruit' OR category = 'veggie')
);
CREATE UNIQUE INDEX food_name_udx ON food(name);

CREATE VIEW fruit AS
  SELECT id, name FROM food WHERE category = 'fruit';

CREATE VIEW veggie AS
  SELECT id, name FROM food WHERE category = 'veggie';

如果类别超过5-10个条目,则使用带有FOREIGN KEY CONSTRAINT的DOMAINS或外部表。

答案 1 :(得分:0)

外键只能引用主键或唯一键。你的food.food_id都不是。这是技术方面。从架构设计的角度来看,我不确定你的目的是否有太多的表。

答案 2 :(得分:0)

我将你的模型更改为:

Table food:
id (key);
name;
category_id;

Table category:
category_id (key);
category_names [fruits, vegetables]

我不明白为什么你需要一个水果和蔬菜的桌子,除非这些桌子与其他桌子有不同的关系..

您还可以阅读有关modeling subclasses in a database

的页面

祝你好运!