0

EMP スーパータイプを 2 つの FULL_TIME_EMP および PART_TIME_EMP サブタイプとともにモデル化することを目的とした次のデータベース リレーショナル スキーマがあります。

データベース スキーマ 私が抱えている問題は整合性の問題です。つまり、フルタイムの従業員は FULL_TIME_EMP テーブルに対応する行しか持てず、同様にパートタイムの従業員は PART_TIME_EMP テーブルに対応する行しか持てないようにしたいと考えています。

以下のスクリーン キャプチャからわかるように、この整合性制約は適用されません。

EMP_TYPE テーブルは次のとおりです。 EMP_TYPE テーブル

そして、EMP テーブル: EMP テーブル

PART_TIME_EMP テーブル: PART_TIME_EMP テーブル

最後に、整合性違反を示す FULL_TIME_EMP テーブル!! FULL_TIME_EMP テーブル

データベース モデルの設計を変更して、この整合性制約を適用する方法はありますか? または、トリガーに頼る必要がありますか?

よろしく、

4

1 に答える 1

3

トリガーに頼る必要はありませんが、役立つ場合があります。構造を変更すると大いに役立ちますが、通常は CHECK 制約に依存します。MySQL では、CHECK 制約が必要な場合は、トリガーを作成するか、外部キー制約を使用する別のテーブルを追加する必要があります。

パートタイムの従業員が後でフルタイムになる可能性があるという点で、追加の負担があります。

ここでは、より標準的な SQL プラットフォーム用にどのように記述しますか。

create table emp (
  emp_id integer primary key,
  emp_type char(1) not null check (emp_type in ('f', 'p')), -- FK in your schema
  emp_name varchar(50) not null,
  start_date date not null default current_date,
  unique (emp_id, emp_type)
);

create table full_time_emp (
  emp_id integer primary key references emp (emp_id),
  emp_type char(1) not null default 'f' check (emp_type = 'f'),
  foreign key (emp_id, emp_type) references emp (emp_id, emp_type),
  salary decimal(14,2) not null check (salary > 15000)
);

create table part_time_emp (
  emp_id integer primary key references emp (emp_id),
  emp_type char(1) not null default 'p' check (emp_type = 'p'),
  foreign key (emp_id, emp_type) references emp (emp_id, emp_type),
  rate decimal(14,2) not null check (rate > 0 and rate < 100)
);

テーブル full_time_emp では、これらの 2 つの制約

  check (emp_type = 'f'),
  foreign key (emp_id, emp_type) references emp (emp_id, emp_type),

一緒にすると、パートタイムの従業員がフルタイムのテーブルに表示されなくなります。「emp」の参照行に「p」が含まれている場合、外部キー参照は失敗します。「full_time_emp」に「p」を挿入しようとすると、チェック制約が失敗します。

この場合、チェック制約を 1 行テーブルと外部キー参照に置き換えることができます。テーブルには「f」のみを含める必要があります。(または、フルタイムの従業員を表すために使用する任意の ID 番号。) 「part_time_emp」についても同じことが機能します。したがって、CHECK 制約の代わりに、 full_time_emp に対してこれを行うことができます。

create table full_time_emp_check (
  full_time_emp_type char(1) primary key
);
insert into full_time_emp_check values ('f');

alter table full_time_emp
add constraint full_time_emp_check
foreign key (emp_type) references full_time_emp_check (full_time_emp_type);

part_time_emp の変更も同様です。これらの両方のテーブルにトリガーを設定して、複数の行が含まれないようにすることができます。

追加のテーブルと外部キー参照を使用して、給与とレートのチェックを実装することもできます。ただし、死んだクジラをビーチに蹴り落とすようなものです。おそらく、MySQL のトリガーを使用して、そのような範囲制約を実装するでしょう。

IMHO、CHAR(1) コードは、従業員タイプの整数よりも優れています。人間が読めるコードには結合は必要ありません。

于 2011-09-14T11:30:57.970 に答える