1

Oracle SQL のジャンクション テーブルに関する簡単な質問です。「多対多」の関係での機能と役割は理解していますが、「1 対多」の関係はどうでしょうか? 私は2つのテーブルを持っていEmployeesますPositions. 各従業員は 1 つの役職しか保持できませんが、各役職には複数の従業員を配置できます。たとえば、John Doe はセールス エグゼクティブにしかなれませんが、会社には 4 人のセールス エグゼクティブがいます。これは私がこれまでにコーディングした方法です:

CREATE TABLE Positions (
position_id NUMBER(2) NOT NULL,
position_name VARCHAR2(25) NOT NULL,
CONSTRAINT pk_position PRIMARY KEY(position_id)
);

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL,
emp_name VARCHAR2(30) NOT NULL,
emp_position NUMBER(2) NOT NULL,
emp_salary NUMBER(5) NOT NULL,
CONSTRAINT pk_employee PRIMARY KEY(emp_id),
CONSTRAINT fk_emp_pos FOREIGN KEY (emp_position) 
REFERENCES Position(position_id)
);

CREATE TABLE pos_emp (
position_id NUMBER(2) NOT NULL,
emp_id NUMBER(3) NOT NULL,
CONSTRAINT pk_pos_emp PRIMARY KEY(position_id, emp_id)
);

これは正しいです?必要性はあり
ますか? Employeeテーブル内の外部キー?
b. ジャンクションテーブル?

従業員テーブルで 1 人の従業員と 1 つのロールの関係を強制し、ジャンクション テーブルで 1 つのロールと複数の従業員の関係を維持したいと考えています。

これが理にかなっていることを願っています

4

1 に答える 1

5

設定した関係は多対多の関係です。したがって、1対多が必要な場合。次に、最も一般的な方法は、 をスキップしpos_empて外部キーを に直接 入れることEmployeeです。テーブルは次のようになります。

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL,
emp_name VARCHAR2(30) NOT NULL,
emp_position NUMBER(2) NOT NULL,
emp_salary NUMBER(5) NOT NULL,
position_id NUMBER(2) NOT NULL,
...

編集

私のコードでは、従業員テーブルをそのように設定しています。Employee テーブルに Position_id を外部キーとして持つだけで、多くの従業員を持つ各ポジションを強制するのに十分でしょうか?

position_idが許可されてEmployeeいない場合null、役職なしで従業員を追加することはできません。つまり、ポジションなしで Employee を挿入しようとすると、外部関係が満たされないという例外が発生します。

ただし、従業員を追加するときに position_id に値が含まれるように、コードで確認する必要があります。そのため、値がない場合、挿入をそのデータベースに送信しません。それは不必要なデータベース呼び出しだからです。

Employeeもう 1 つの興味深い点は、 ?を削除するとどうなるかということです。Employeeその位置に関連する を削除する必要がありますか? 答えが「はい」の場合。位置テーブルからカスケード削除を行うことを検討してください。そうしないと、トリガーが必要になる場合があります。

于 2012-05-03T14:57:04.813 に答える