2011-05-23 1 views
0

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

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. Это возможно?

ответ

0

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

+0

Я хочу обратиться к основным ключам: либо fruit.food_id, либо vegetable.food_id ... в зависимости от категории, указанной в таблице продуктов питания. Вы думаете, я могу пойти в этом примере только 3 таблицы? Фрукты и овощи должны быть двумя совершенно разными столами. – gruenkohl

+0

Как пожелаете. Но один внешний ключ не может ссылаться на несколько первичных ключей. Вы должны моделировать его обратным способом, т. Е. Сделать 'food_id' основным ключом' food' и ссылаться на него из «дочерних таблиц». Там вы можете иметь первичный ключ * И * внешний ключ в том же поле. –

0

Я бы изменить свою модель к этому:

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

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

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

Вы также можете прочитать эту страницу modeling subclasses in a database

Удачи!

1

Если проблема действительно просто, а затем просто использовать МНЕНИЕ:

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 записей.

+0

Нет моей проблемы не так просто. Может быть, мой пример еды не был таким хорошим. Я начинаю работать с базой данных, и теперь я обнаружил, что отношение между многими категориями и фруктами/овощами, где таблица еды служит столом ассоциации, было тем, что я хотел. Спасибо за вашу помощь! – gruenkohl