也许是一个关于外键的新问题,但我想知道答案。
假设我有两张桌子:
products
--------
product_id (int)
name (unique) (varchar)
description (text)
vendor (varchar) (foreign key: vendors.name)
以及
vendors
--------
name (varchar)
我知道我应该使用
vendor_id (int)
,但这只是一个帮助我提问的例子。所以:如果我创建了vendor:Apple和product:1,iPhone 4,Description….,Apple,那么varchar“Apple”将同时存储在products和vendors中,或者仅仅存储在vendors中(因为外键)?
这是一个错误的数据库设计吗?
最佳答案
这在数据库中称为“规范化”。在您的示例中,需要考虑以下几点:
为了让products
有一个外键来vendors
,vendors
需要一个键。name
是vendors
的主键吗?如果是,那么外键也将是avarchar
。在这种情况下,是的,值“Apple”将存储在两者中。(注意,这不是一个好主意。)
如果将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
这将把两个表“连接”到一个表中(实际上不只是为了查询),并从中选择记录。
关于mysql - MySql外键,它实际上如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8809068/