Внешний ключ в зависимости от второго внешнего ключа - PullRequest
0 голосов
/ 23 мая 2011

моя проблема довольно проста, но я не могу найти никакого решения.Допустим, у меня есть следующее:

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]

Теперь я хочу построить ограничение внешнего ключа от столовой еды до столов фрукты + овощи, в зависимости от категории, указанной в category_id.Возможно ли это?

Ответы [ 3 ]

1 голос
/ 23 мая 2011

Если ваша проблема действительно так проста, просто используйте 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';

Используйте DOMAINS или внешнюю таблицу с FOREIGN KEY CONSTRAINT, если категория превышает 5-10 записей.

0 голосов
/ 23 мая 2011

Я бы поменял вашу модель на такую:

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

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

Я не понимаю, зачем вам стол для фруктов и овощей, кроме случаев, когда эти столы имеют разные отношения с другими столами ..

Вы также можете прочитать эту страницу о подклассах моделирования в базе данных

Удачи!

0 голосов
/ 23 мая 2011

Внешние ключи могут ссылаться только на первичные ключи или уникальные ключи. Ваш food.food_id не является ни тем, ни другим. Это технический аспект. С точки зрения разработки схемы, я не уверен, что у вас может быть слишком много таблиц для вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...