2017-04-01 48 views
0

私はmysqlの に2つのテーブルがあるとし1.Child(名前、father_name) 2.Father .Father_name子テーブルの参照名に(名前、連絡先)なぜ外部キーが複合主キーの一部を参照できるようにするのですか?

テーブルの父は複合キー(名前、連絡先)を持っています父の中で。したがって、外部キーは主キーの一部を参照します。これはmysqlによって許可されます。

ただし、次のような状況を考慮してください。

表の父親は、以下のタプルがあります

(kishan,9906011111) 
(kishan,99906) 

は今、私はどののKishanに知っているだろうどのように

(xyz,kishan) 

子に行を挿入するとし父親のテーブルは、子供に関連するxyzですか?

この状況は、mysqlが主キーの一部を参照するために外部キーを許可しない場合に発生する可能性があります。

mysqlが許可しているこのスキームのメリットについてお答えください。

+0

a * foreign *キーが値の** list **に対応する可能性があるためです。 –

答えて

0

これはMySQLの特質です。私の意見では、外部キーは一意のキーまたは主キーのみにする必要があります。外部キーの関係を使用して値の「セット」へのマッピングを行うべきではありません。

明らかに、MySQLの設計者は(私と他のデータベースの両方の実装者と)同意していません。それらは、インデックス付けされた列(MySQL用語では、「キー」として定義されている)への外部キー関係を許可します。複合主キーがある場合、最初の列はそのようなキーです。

問題を防止し、あなたのテーブルが明確な、使いやすいようにするために、私はお勧めします:

  • すべてのテーブルには自動インクリメントの主キーを持っています。
  • すべての外部キーの関係は、のプライマリキー(ユニークキーまたは他の種類のキーではありません)です。
  • プライマリキーの名前は、エンティティの単数形の後にid(例:thingsはプライマリキーとしてthingId)となります。
  • 外部キーは、主キーと同じ名前です(ただし、同じテーブルに複数の外部キー関係があるため、これが不可能な場合を除く)。
関連する問題