2011-05-23 19 views
0

私の問題は非常に簡単ですが、解決策が見つかりません。2番目の外部キーに応じた外部キー

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

私はフードテーブルで指定されたカテゴリに応じて、主キー:fruits.food_idまたはvegetables.food_id ...を参照します。この例では、3つのテーブルしか使用できないと思いますか?果物と野菜は2つの全く異なるテーブルであると考えられています。 – gruenkohl

+0

お望みの通りです。しかし、1つの外部キーは複数の主キーを参照することはできません。これを逆の方法でモデル化する必要があります。つまり、 'food_id'を' food'の主キーにし、 'child_テーブル 'からそれを参照してください。そこでは、同じフィールドにプライマリキー* AND *外部キーを持つことができます。 –

0

私はこれまで、あなたのモデルを変更したい:あなたは、果物や野菜のためのテーブルを必要とする理由私は

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

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

を見ることができないそれらのテーブルが他のテーブルに別の関係を持っている場合...

除きます

このページを読むことができますmodeling subclasses in a database

おはよう!

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のエントリを超えて成長した場合、外部キー制約と外部テーブル。

+0

私の問題はそれほど単純ではありません。たぶん私の食べ物の例はそれほど良いことではなかったでしょう私はデータベースの初心者であり、カテゴリと果物/野菜の多対多の関係が、食卓が協会のテーブルとして機能していることが、私が望んでいたことであることがわかりました。あなたの助けをありがとう! – gruenkohl