0

クラステーブルの継承を次のように使用するとします。

CREATE TABLE person
(
   id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
   forename VARCHAR(30) NOT NULL,
   surname VARCHAR(30) NOT NULL
);

CREATE TABLE employee
(
   id INT(10) NOT NULL,
   salary INT(10),
   FOREIGN KEY (id) REFERENCES person (id)
);

CREATE TABLE volunteer
(
   id INT(10) NOT NULL,
   FOREIGN KEY (id) REFERENCES person (id)
);

さて、ここで、自分のサイトのアクセス許可を確認したいとします。つまり、ある人が従業員かボランティアかを確認する必要があります。「タイプ」テーブルの「人」に外部キーを入れることはできますが、従業員のサブタイプがボランティアに変更される可能性があり、スーパークラスのこの「タイプ」も更新する必要があるため、これは問題を引き起こします。

これがないと、いずれかのテーブルで id の存在を検索して、そのサブタイプを見つける必要があり、非常に非効率的です。単一のフィールドを使用してサブタイプを把握できる方法が必要です。誰でも助けることができますか?

4

1 に答える 1

0

最も簡単な方法は、ビューを使用することです。

create view persons_all as (
select p.id, p.forename, p.surname, 'employee' as category
from person p
inner join employee e
        on p.id = e.id
union all 
select p.id, p.forename, p.surname, 'volunteer' as category
from person p
inner join volunteer v
        on p.id = v.id
);

そのテキストを従業員の場合は「E」、ボランティアの場合は「V」に短縮することを検討できます。

「employee」と「volunteer」の主キーを宣言する必要があります。

あなたの設計には、同じ人が従業員とボランティアの両方として参加することを防ぐものは何もありません。それはあなたが意図したものではないかもしれません。

于 2013-03-30T22:02:44.393 に答える