2012-01-10 10 views
1

外国キーについての初心者の質問かもしれませんが、私は答えを知りたいです。私はvendor_id (int)を使用する必要があることを知っているが、これは私が私の質問を支援するための単なる一例であるMySqlの外部キー、実際の動作方法

products 
-------- 
product_id (int) 
name (unique) (varchar) 
description (text) 
vendor (varchar) (foreign key: vendors.name) 

vendors 
-------- 
name (varchar) 

はのは、私は2つのテーブルがあるとしましょう。

したがって、ベンダー:Apple、製品:1、iPhone 4、Description ..、Appleの場合、varchar "Apple"は製品とベンダーの両方に、キー)? これは間違ったデータベース設計ですか?

答えて

2

これは、データベース内の「正常化」と呼ばれています。あなたの例では、カップルの事を考慮することがあります:vendorsに外部キーを持つことが

  1. productsためには、vendorsキーを必要とします。 namevendorsの主キーですか?その場合、外部キーもvarcharになります。その場合、はい、値 "Apple"は両方に保存されます。
  2. vendorsテーブルにvendor_id整数列を追加し、それがそのテーブルの主キーである場合は、vendor_id(または他の名前)を追加することができます。列をproductsテーブルに移動し、vendorsテーブルの外部キーにします。この場合、その整数だけが両方のテーブルに格納されます。これは、データが正規化される場所です。小さな、より単純なデータ型(整数)は、レコードを記述する実際のデータを含むテーブルをリンクします。

このキー値だけが両方のテーブルに格納されます。これは、データを選択するときにテーブルを結合するための参照として使用されます。例えば、与えられた製品とそのベンダーを選択するために、あなたはこのような何かをしたい:

SELECT products.name, products.description, vendors.name AS vendor 
FROM products INNER JOIN vendors ON products.vendor_id = vendors.vendor_id 
WHERE products.product_id = ?id 

これは、単一のテーブルに2つのテーブルを「参加する」でしょう(本当に、ただのクエリのために)そこからレコードを選択します。

1

両方に保存されます。外部キー制約では、products.vendorのすべての値がvendor.nameのどこかに表示されている必要があります。

(ところで、ストレージエンジンはInnoDBのであればMySQLは唯一の外部キー制約を強制することに注意してください。)