2012-01-10 57 views
1

也許是一個關於外鍵的新手問題,但我想知道答案。MySql外鍵,它是如何工作的

比方說,我有2個表:

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

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

我知道,我應該使用vendor_id (int),但是這僅僅是一個例子,幫我問我的問題。因此:如果我創建供應商:蘋果公司,並且產品:1,iPhone 4,說明......,那麼Apple將varchar「Apple」存儲在產品和供應商中,或者僅存儲在供應商中(因爲外國公司鍵)? 這是一個錯誤的數據庫設計?

回答

2

這是在數據庫被稱爲「正常化」。在您的例子中,有幾件事情要考慮:

  1. 爲了products有一個外鍵vendorsvendors需求的關鍵。 namevendors的主鍵嗎?如果是這樣,那麼外鍵也將是varchar。在那種情況下,是的,值「Apple」將被存儲在兩者中。 (請注意,這不是一個很好的主意。)
  2. 如果添加vendor_id整數列,vendors表,它是該表的主鍵,那麼你可以添加一個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 

這將「加盟」的兩個表到一個表(不是真的,只是爲了查詢)並從中選擇記錄。

1

它將被存儲在兩者中。外鍵約束要求products.vendor中的每個值都出現在vendor.name的某處。

(順便說一句,請注意,MySQL只強制執行外鍵約束,如果存儲引擎InnoDB的是)