2017-02-25 15 views
0

教師、生徒、メッセージという3つのテーブルがあるとします。Mysql 2つの異なるテーブルの主キーである2つの列への参照を持つ外部キー

教師:

----------- 
ID | name | 
----------- 
t_1| Dani | 
----------- 
t_2| Billy| 
----------- 

学生:

------------- 
ID | name | 
------------- 
s_1| Luckas | 
------------- 
s_2| Oliver | 
------------- 

メッセージ:

-------------------------------- 
| ID | sender_ID | receiver_ID | 
-------------------------------- 
| 1 | s_1  | s_2   | 
-------------------------------- 
| 2 | s_1  | t_1   | 
-------------------------------- 
| 3 | s_1  | t_2   | 
-------------------------------- 
| 4 | t_1  | s_2   | 
-------------------------------- 

テーブルが、私はそれをよりよく行う方法を知りませんでしたどのように見えるかについては申し訳ありません。

教師や生徒の値だけがmessages.sender_idとmessages.receiver_IdにFKの場合のように格納されることを許可します。

私はそれが可能かどうか、もしそうなら、どうすればいいのか知る必要がありますか?

+0

あなたは学生や教師が送信者や受信機の両方の可能性があることを意味ON DELETEでしょうか? – Oscar

+0

はい、どうすればいいですか? – Orih90

+0

この場合、外部キーは使用できません。外部キーは、単一のテーブルのフィールドを参照します。トリガを使用してデータの整合性を強制することができます – Shadow

答えて

1

2つの選択肢があります。 まず、Personテーブルと別のPersonTypeを作成します。 PersonTypeには、 "Student"と "Teacher"が値として含まれます。 PersonTypeIdをPersonに追加し、PersonTypeへの外部キーを作成します。これは、看護師と教師の間の弁別子として機能します。 Personからのメッセージテーブルに外部キーを追加します。

第2は、「データベース継承」を作成することです。学生と教師の間で共通のデータを持つPersonテーブルを作成します。次に、それぞれの特定のデータを持つ生徒と教師のテーブルを作成し、両方の外部キーをPersonに追加します。 Personテーブルからのメッセージに外部キーを追加します。 最初の解決策はより効果的です。

0

MySQLは、この整合性ルールを強制するための宣言的な外部キー制約をサポートしていません。図示されているようなテーブル(すなわち、テーブルの変更なし)では、トリガを使用して、これらの種類の参照整合性ルールを実施することができます。 3つのテーブルすべてに対してBEFORE INSERT、BEFORE UPDATE、BEFORE DELETEトリガーを組み合わせる必要があります。

studentテーブルとteacherテーブルの両方に同じ値(たとえば、k_9)が表示されないようにするルールはありません。したがって、sender_IDのメッセージの行はk_9です。studentteacher、またはその両方を参照する方法はありません。それはテーブル定義を変更することが可能です


は、我々はstudentteacherのスーパークラスとしてpersonテーブルを実装することができます。それを実現するための2つのパターン。 1つの可能性は、弁別子列を追加することです。

person 
ID type  name 
--- ------- ------ 
s_1 student Lukas 
s_2 student Oliver 
t_1 teacher Dani 
t_2 teacher Billy 
k_9 student Rover 

このテーブルでは、messagesからの外部キー制約の宣言は簡単です。

我々はstudentsテーブルの同等とオリジナルデザインのteachersテーブルを返すことができます。

学生

SELECT ID, name FROM person WHERE type = 'student' 

教師

SELECT ID, name FROM person WHERE type = 'teacher' 

しかし、唯一の3与えられたが質問に表示されるテーブル、それは可能ではありませんo指定された参照整合性ルールを強制するために外部キー制約を宣言します。これらの種類の整合性ルールを適用する唯一の方法は、トリガーによるものです。

BEFORE INSERT ON messages 
FOR EACH ROW 
BEGIN 
    -- if NEW.sender_ID is non-NULL, verify the value appears 
    -- as value in `ID` column of either `students` or `teachers` 
    -- if not, throw an error 

    -- if NEW.receiver_ID is non-NULL, verify the value appears 
    -- as value in `ID` column of `students` or `teachers` 
    -- if not, throw an error 

END 

我々はまた、メッセージのON UPDATEのトリガーと同様に、UPDATEを必要とし、生徒と教師

関連する問題