2012-01-10 60 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的是)