2016-08-02 8 views
2

私はそうのような項目を表すテーブルを持っている:複数の外部キーを持つ表のデザインを改善するには、キーのうち1つのみがいつでも使用されますか?

item(id, description, motor_id, product_id, drive_id); 

私が持っている問題は、項目が一つだけ「モータ」、「ドライブ」、または「製品」の可能性があることです。いずれの場合も、外部キーはモーター、製品またはドライブでいっぱいになっている別のテーブルを指します。

itemのこの表のデザインは改善されているか、それともかなり良いですか?

私の懸念は、3つの外部キーを持つことですが、そのうちの1つだけが一度に使用できるということは、悪いデザインの兆候です。他のテーブルの

構造

motor(id, description, hp, voltage, motor_orientation); 
drive(id, feature, model, weight, dimensions, hp); 
product(id, description, model, class, type, option1, option1_cost); 
+0

は、リストした属性(モーター、製品、ドライブ)のうち、アイテムに必要なものは3つだけですか? – Sevyns

+0

モーター、製品、およびドライブテーブルの構造を明らかにすることはできますか? –

+0

@Tim - テーブル構造の回答が更新されました。(それぞれ全く異なります) – Dennis

答えて

4

これは、リレーショナル・データベースを使用して、「一の」関係を実装するための合法的な方法です。

alter table t 
    add constraint chk_t_foreignkeys 
     check (((case when motor_id is not null then 1 else 0 end) + 
       (case when product_id is not null then 1 else 0 end) + 
       (case when drive_id is not null then 1 else 0 end) 
       ) = 1 
       ); 

「ワンの」関係を実装するこの方法は、外部キーを明示的に宣言して施行されるという利点を有する:上記に加えて、あなたは、列の正確に一つがNULLではないことを義務付ける必要がありますほとんどのデータベースは、たとえ1つしか使用されていなくても、各キーのための領域を予約するという欠点があります。

関連する問題