2012-01-20 17 views
0

システム間のインターフェイスとして使用しているデータベーステーブルがあります。私はそれに書きます、彼らはそれから読む。私はテーブル内に私のユーザテーブルを参照する外部キーを持っています。代替の外部キーを使用したデータベースの制約

今やインターフェイスは複雑になっています。私は今、ユーザーテーブルを参照していないインターフェイステーブルの別の使用方法があります。私はもちろん、ユーザーテーブルへの外部キー制約を緩和することができます。

私がしたいのは、この外部キーが満たされているか、この別のキー(別の列にある)が満たされているという制約状態です。これは可能ですか?

私はoracleデータベースを持っています。

答えて

0

私は新しいインターフェイス要件のために別のテーブルを作成します。制約の1つの違いは別の制約につながります。

次に、ビューを作成してアプリケーションソフトウェアをベーステーブルからではなくビューから読み込ませるかどうかについて考えてみましょう。

+0

ビューの作成が最適でした – Aaron

0

いいえ、できません。 は、いずれか一方のテーブルまたは他のテーブルにリンクする第3のキーテーブルに相当するものをまとめていますが、非常には厄介で脆いです。

代わりに、私はと非常にで、あなたの現在の統合戦略を再訪することをお勧めします。

+0

私はそれがkludgeであることに同意します。しかし、2つのテーブルを公開するよりもむしろ厄介ですか? – Aaron

3

両方の列をNULL可能に宣言し、2つの列のうちの1つがNULLでないことを確認するチェック制約を作成できます。私は教授のためにと講師のための個別のテーブルを持っていると私はクラスが教授や講師ではなく、両方を持つことができるいずれかのようなクラスをモデル化したい場合

たとえば、私はこの

SQL> ed 
Wrote file afiedt.buf 

    1 create table professor(
    2 professor_id number primary key 
    3*) 
SQL>/

Table created. 

SQL> create table lecturer(
    2 lecturer_id number primary key 
    3 ); 

Table created. 

SQL> create table class(
    2 class_id number primary key, 
    3 lecturer_id number references lecturer(lecturer_id), 
    4 professor_id number references professor(professor_id), 
    5 check((lecturer_id is null and professor_id is not null) or 
    6   (lecturer_id is not null and professor_id is null)) 
    7 ); 

Table created. 

SQL> insert into professor values(1); 

1 row created. 

SQL> insert into lecturer values(20); 

1 row created. 

SQL> insert into class values(1, 20, null); 

1 row created. 

SQL> insert into class values(2, null, 1); 

1 row created. 

SQL> insert into class values(3, 20, 1); 
insert into class values(3, 20, 1) 
* 
ERROR at line 1: 
ORA-02290: check constraint (SCOTT.SYS_C0014175) violated 
ような何かを行うことができますもちろん

は、データモデリングの観点から、頻繁にLECTURERまたはPROFESSORのいずれであってもよく、INSTRUCTORに非NULL可能外部キーでCLASSテーブルを作成するINSTRUCTOR_TYPEを持つ単一INSTRUCTORのテーブルを作成するために、良いアイデアになります表。