也许是一个关于外键的新手问题,但我想知道答案。
假设我有两个表:
products
--------
product_id (int)
name (unique) (varchar)
description (text)
vendor (varchar) (foreign key: vendors.name)和
vendors
--------
name (varchar)我知道我应该使用vendor_id (int),但这只是一个帮助我提出问题的示例。
所以:如果我创建厂商: Apple,并且产品: 1,iPhone 4,Description..,那么变量字符" Apple“将同时存储在产品和厂商中,还是只存储在厂商中(因为外键)?这是一个错误的数据库设计吗?
发布于 2012-01-11 03:20:02
这在数据库中称为“标准化”。在您的示例中,有几件事需要考虑:
products有一个指向vendors的外键,vendors需要一个键。name是vendors的主键吗?如果是这样,那么外键也将是一个varchar。在这种情况下,值"Apple“将存储在这两个文件中。(请注意,这不是一个非常好的主意。)vendors表添加一个vendor_id整数列,并且它是该表的主键,那么您可以向products表添加一个vendor_id (或任何其他名称)列,并使其成为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这将把两个表“连接”到一个表中(实际上不是,只是为了查询),并从中选择记录。
发布于 2012-01-11 03:16:17
它将存储在这两个文件中。外键约束要求products.vendor中的每个值都出现在vendor.name中的某个位置。
(顺便说一句,请注意,只有在存储引擎为InnoDB时,MySQL才会强制执行外键约束。)
https://stackoverflow.com/questions/8809068
复制相似问题