3

Oracle 10g では、外部キーの参照整合性制約を定義して、複数の親テーブルの主キーを参照することは可能ですか。

例えば:

DEPT_AMER

DEPT_ID
10
11
12

DEPT_APAC

DEPT_ID
13
14
15

DEPT_EMEA

DEPT_ID
16
17
18

EMP

EMP_ID DEPT_ID
500 11
501 15

EMP.DEPT_ID で DEPT_AMER、DEPT_APAC、DEPT_AMER のいずれかの部門 ID を参照できるようにします。このニーズを満たすために参照整合性を定義する方法はありますか。3 つのテーブルすべての DEPT_ID は、共通のシーケンスから生成され、一意であることが保証されています。

参照整合性の制約が不可能な場合、このデータの整合性を維持するためのより良い方法はありますか?

4

4 に答える 4

6

3 つの異なるテーブルに 1 つのエンティティがあります。最良の方法は、DEPT_AMER + DEPT_EMEA + DEPT_APAC を、新しいフィールド DEPT_TYPE (AMER または EMEA または APAC) を持つ DEPT という 1 つのテーブルに結合することです。機能のサポートとパフォーマンスの面で優れています。

南極に新しい部門ができたらどうしますか? 別のテーブルを追加しますか? いいえ!別の dept_type を追加するだけです。

于 2011-03-29T15:11:13.190 に答える
6

すべてのテーブルのフィールドが同じである場合は、このモデルを単一のテーブルに屈折させ、レガシー アプリケーション用のビューを作成することをお勧めします。この設計がパーティションに使用されることもありますが、Oracle はパーティションを自動的に維持し、アプリケーション レベルのパーティション分割は冗長です。

于 2012-11-28T15:33:30.177 に答える
2

制約を定義することはできますが、希望どおりにはなりません。キー DEPT_ID は各 DEPT_ テーブルに存在する必要があるため、 emp テーブルに何も追加することはできません。

既存の構造を維持する必要があると仮定すると、最も簡単な方法は、これらの各テーブルを 1 つのビューにマージするマテリアライズド ビューを定義することです。IMO、これは欠陥のある実装です。DEPT_ info 用に 1 つのテーブルを作成し、さまざまなタイプを分割する列を作成します。

于 2011-03-29T15:11:54.203 に答える
1

このような FK 制約を定義することはできません。ただし、トリガーを使用してデータの整合性を検証できます。例えば:

 CREATE OR REPLACE TRIGGER emp_check_dept_id_trg
    BEFORE INSERT OR UPDATE 
    on emp
    FOR EACH ROW
    DECLARE
      l_res NUMBER;
    BEGIN
      SELECT count(*) 
      INTO l_res
      FROM (
              SELECT dept_id FROM DEPT_AMER WHERE dept_id = :NEW.DEPT_ID
            UNION ALL
                SELECT dept_id FROM DEPT_APAC WHERE dept_id = :NEW.DEPT_ID
            UNION ALL
                SELECT dept_id FROM DEPT_EMEA WHERE dept_id = :NEW.DEPT_ID
          )
      ;
      IF l_res = 0 THEN
        raise_application_error(-20000, 'referential integrity violated');
      END IF;
    END;
    /
于 2011-03-29T15:29:03.830 に答える