2012-03-20 22 views
11

懸念の私の二つの表のとおりです。外部キー(SQL)などの複合キー

CREATE TABLE IF NOT EXISTS `tutorial` (
    `beggingTime` time NOT NULL, 
    `day` varchar(8) NOT NULL, 
    `tutorId` int(3) NOT NULL, 
    `maxMembers` int(2) NOT NULL, 
    `minMembers` int(1) NOT NULL, 
    PRIMARY KEY (`beggingTime`,`day`,`tutorId`), 
    KEY `tutorId` (`tutorId`) 
) 


CREATE TABLE IF NOT EXISTS `group` (
    `groupId` tinyint(3) NOT NULL AUTO_INCREMENT, 
    `status` varchar(20) NOT NULL, 
    `groupName` varchar(50) NOT NULL, 
    PRIMARY KEY (`groupId`) 
) 

私は「チュートリアル」で複合一意キーにリンクする「グループ」でフィールドを作成したいと思います。だから私は私の質問は、これらのテーブルをどのように関連付けるのだろうと思いますか?私は 'チュートリアル'の各プライマリキーの 'グループ'に外部キーフィールドを作成する必要がありますか?

+0

1:1,1:n、n:1、またはn:mの関係が必要ですか?すなわち、いくつのグループのチュートリアルがいくつあるのか? – Aprillion

答えて

19

Per the mySQL documentation複数の列を作成する必要があるコンポジットに外部キーマッピングを設定できるはずです。

列を追加し、スティーブンとして

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`) 

は以下のコメントで示唆したたあなたgroupテーブルでこれを入れて、あなたは、このチュートリアルの表は、実際の主キーを使用するように( - 建築家を直すようにしてくださいたとえ単なるアイデンティティ代理キーであっても)。これにより、コンポジットではなく、このタイプのリレーションシップ用にSQLが構築されるため、パフォーマンスが向上します。

+2

可能性がありますが、これは重大なパフォーマンス上のペナルティを持っている必要があります。外部キーにマップされた主キーは、業界標準のものです。 –

+0

@SteveWellensありがとうございます、あなたのコメントに基づいて自分のコメントに基づいて私の答えを更新しました。私は最初に直接答えに言及してください。 –

+2

警告:参照されている列は、正しい順序を取得するには、外部キー(SSMSのテーブルを展開するときにキーフォルダの下)を右クリックし、クリップボードに作成スクリプトを作成します。ペースト。参照する列がキーと同じ順序であることを確認してください。 – Trevor

0

1]最初のテーブルを書き換えます。最初にtutorIdと入力すると、それは自動的にすべてのキーとなります。実際、合成列の最後の部分を除くすべてがキーになります。

CREATE TABLE IF NOT EXISTS `tutorial` (
`beggingTime` time NOT NULL, 
`day` varchar(8) NOT NULL, 
`tutorId` int(3) NOT NULL, 
`maxMembers` int(2) NOT NULL, 
`minMembers` int(1) NOT NULL, 
PRIMARY KEY mykey (`tutorId`,`beggingTime`,`day`) 
) 

2]非常に多くのインデックスを持つことは、大量の書き込みテーブルでは非常に高価です。したがって、チュートリアルの追加フィールドを外部キーとして使用することを検討してください。おそらくauto_increment record_idです。それにいくつかの考えを与えてください。