也许是一个关于外键的新问题,但我想知道答案。
假设我有两张桌子:

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有一个外键来vendorsvendors需要一个键。namevendors的主键吗?如果是,那么外键也将是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/

10-10 06:40